来认识下volatile这个关键字。当一个变量被声明为volatile变量后,对于这个变量的读写操作会比较特别。其实volatile关键字对于域的单个读写相当于一个锁对这个变量的读写做了同步。但是对于一个变量的多个操作就不同了。
锁的happens-before原则保证锁的释放和获取之间的内存可见性,所以对于一个volatile变量的读,总能看到任意线程对于这个变量的写。锁的语义决定了临界区代码的执行具有原子性,这意味着即使是64位的long和double型变量,只要它是volatile变量,对于变量的读写就将具有原子性。如果是过个volatile操作或者volatile++这用复合操作。这些操作整体上不具有原子性。
简而言之, volatile变量具有以下特性:
1. 可见性:对于volatile变量的读总能看到任意线程对于它的写
2. 原子性:volatile对于单个变量的读写操作具有原子性,但是对于多个volatile操作或者复合操作不具有原子性
volatile的内存语义:
1. 当读一个volatile变量时,JMM会把该线程对应的本地内存中的置位无效,线程接下来将从主存中读取变量值
网友评论