Volatile消除了可见性和排序问题。而原子工具包则提供操作的原子性。Volatile使用happens-before关系,而Atomic使用比较和交换。
为什么需要引入新的抽象层,比如原子工具包,而不是增强volatile关键字本身?是否存在可以由原子工具包解决的特定情况?
实际上,如果你仔细观察Atomic*
的实现,你会发现它们都持有volatile
字段的值。
IMHO原子已经是volatile机制的一种扩展,为原子CAS
操作提供了方便的方法。
隐藏CAS
实现也有好处。例如hotspot jvm大量使用intrinsic来实现压缩性能。
更改现有的语言结构(如volatile
)很可能意味着破坏现有的应用程序。因此,这通常不是一种选择,特别是对于Java语言。创建新库不会影响现有的应用程序,因此完全向后兼容。
除此之外,atomic
包中的类还提供了像compareAndSet
这样的高级操作,这些操作不能直接添加到volatile
关键字中。