加锁可以保证可见性与原子性;volatile变量只能保证可见性。
只有满足了下面所有的标准后,你才能使用volatile变量:
写入变量时并不依赖变量的当前值;或者能够确保只有单一的线程修改变量的值;
变量不需要与其它的状态变量共同参与不变约束;
而且,访问变量时,没有其他原因需要加锁。
volatile变量固然方便,但也有限制。它们通常被当作标识完成、中断、状态的标记使用(可以看一些框架如spring,netty等并发中的状态)。尽管volatile变量也可以用来表示其他类型的状态信息,但是决定这样做之前请格外小心。比如,volatile的语义不足以使自增操作(++)原子化,除非你能保证只有一个线程对变量执行写操作。(原子变量提供了”读-写-改“原子操作的支持,而且常被用作”更优秀的volatile变量“。)
转载于:https://my.oschina.net/doctor2014/blog/396224