2017年2月7日星期二

synchronized vs volatile

http://www.cnblogs.com/soaringEveryday/p/4418604.html

总结就是
一个变量a

如果需要依赖a,再改变a,就需要 synchronized。因为依赖+改变,要原子,必须synchronized。synchronized保证了原子性+可见性。

如果只是改变a,用volatile。这里改变,不包括a=a+1这样的,只能是a=1。volatile能保证可见性。

这里我也想了单纯的赋值比如a=1,汇编执行时是几个语句,查了一下,int的赋值的确是原子,那么如果long呢,是否还可以用volatile来保证可见性?? 虽然不原子了。何时将thread里的变量更新会共享变量区?


但是,神奇的是
http://blog.csdn.net/yuanwofei/article/details/12843591
根据Java规范,对于基本类型的赋值或者返回值操作,是原子操作。但这里的基本数据类型不包括long和double, 因为JVM看到的基本存储单位是32位,而long 和double都要用64位来表示。所以无法在一个时钟周期内完成。

不知是不是真的这样原因,是不是如果我的jvm是64bit,long和double也原子了。


http://blog.csdn.net/zhaifengmin/article/details/46315003
Java中的原子操作包括:
1)除long和double之外的基本类型的赋值操作
2)所有引用reference的赋值操作
3)java.concurrent.Atomic.* 包中所有类的一切操作。