来源:Java并发编程实践
访问volatile变量的操作不会加锁,也就不会引起执行线程的阻塞,这使得volatile变量相对于synchronized而言,只是轻量级的同步机制。volatile变量固然方便,但也存在限制。它们通常被当做标识完成、中断、状态的标记使用,如下的asleep标记。
volatile boolean asleep; ... while (!asleep) countSomeSheep();
尽管volatile也可以用来标示其他类型的状态信息,但是决定这样做之前应该格外小心。比如,volatile的语义不足以使自增操作(count++)原子化,除非你能保证只有一个线程对变量执行写操作。加锁可以保证可见性和原子性;volatile变量只能保证可见性。
只有满足了下面的标准后,你才能是使用volatile变量:
1、写入变量时并不依赖变量的当前值;或者能够确保只有单一的线程修改变量的值;
2、变量不需要与其他状态变量共同参与不变约束;
3、访问变量时,没有其他原因需要加锁。