21
21.3.3 原子性与易变性
**
在非volatile域上的原子操作必须刷新到主内存中,因此其他读取该域的任务也不必看到这个新值。如果多个任务在同时访问某个域,那么这个域应该是volatile的,否则,这个域就应该只能经由同步来访问。同步也会导致向主存中刷新,因此如果一个域完全有synchronized方法或语句块类防护,那就不必将其设置为使volatile的。
一个任务所作的任何写入操作对这个任务涞水都是可见的,因此如果它只需要在这个任务内部可见,那么你就不需要将其设置为volatile的。
当一个域的值依赖它之前的值(例如递增一个计数器),volatile就无法工作了,如果某个域的值受到了其他域的限制,那么volatile也无法工作。
使用volatile而不是synchronized的唯一安全的情况是类中只有一个可变的域。再次提醒,你的第一选择应该是使用synchronized关键字,这是最安全的方式,而尝试其他任何方式都是有风险的。
21.4.2 在阻塞时终结
ReentrantLock 上阻塞的任务具备可以被中断的能力。
**
