Java多线程:volatile变量

概念


Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。

当把变量声明为volatile类型后,编译器于运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序

volatile变量不会缓存到寄存器或者其他处理器不可见的地方,因此在读取volatile变量的时候总会返回最新写入的值

volatile变量对可见性的影响比volatile变量本身更为重要。当线程A首先写入一个volatile变量并且线程B随后读取该变量时,在写入volatile变量之前的对A可见的所有变量的值,在B读取了volatile变量后,对B也是可见的。

因此,从内存可见性的角度来看,写入volatile变量相当于退出了代码块,而读取volatile变量就相当于进入了代码块。

虽然volatile变量很方便,但是也存在一定的局限性。因为volatile变量只能确保可见性而不确保原子性。而加锁机制则确保了原子性和可见性。

当且仅当满足以下所有条件时候,才应该使用volatile变量:

  1. 对变量的写入操作不依赖于变量的当前值,或者你能确保只有单个线程更新变量的值。

  2. 该变量不会与其他状态变量一起纳入不变性条件中。

  3. 在访问变量时不需要加锁。

实际上在Java中已经不再推荐使用volatile关键字了,Java5增加的新特性原子变量提供了更加好的’读-改-写’的原子操作,并且常常作为一种更加好的volatile变量

更多


请参考:Java 理论与实践: 正确使用 Volatile 变量