volatile变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了volatile变量相关的知识,希望对你有一定的参考价值。

   volatile英文含义为易变的,是java的一个关键字,可以实现同步的部分功能。volatile可以看做轻量级的synchronized。synchronized可以实现同步的可见性和原子性。volatile只可以实现可见性,即保证多线程的每次读取操作均可以读到最新的值;因未实现同步的原子性要求,不可用于类似于计数器(++x)这样的写操作(读、写、存储)。in short,volatile可以用于的场景如下:

  1. 变量的最新状态不依赖于之前的任一状态,比如++x即不适用;

  2. 该变量也没有包含在其他变量的不变式中;

    可用典型场景:1.状态标识;2.一次性发布(状态不再变化);3.传感器;

    文章给出了一种开销较低的读-写同步方式

    	@ThreadSafe
    	public class CheesyCounter {
    	    // Employs the cheap read-write lock trick
    	    // All mutative operations MUST be done with the ‘this‘ lock held
    	    @GuardedBy("this") private volatile int value;
    
    	    public int getValue() { return value; }
    
    	    public synchronized int increment() {
    	        return value++;
    	    }
    	}

   之所有称之为开销较低是因为volatile保证了数据的可见性,且允许多个线程同时访问,比使用synchronized(每次仅允许持有锁的线程访问)同步可以获得更高的共享度,且开销较低。而写操作使用synchronized又填补了volatile无法实现原子性导致更新出错的缺陷。但这种模式也具有volatile的弱点;如果使用不当,会造成错误。


  综上,volatile是一种脆弱但简洁的同步机制,如果volatile修饰的变量真正具有——其当前值不依赖于当前及以前任一状态———这样的特性,可以提供类似synchronized的效果。由于开销较小,且代码简洁,在读操作远远大于写操作且遵循以上应用场景,可用volatile标识实现读的同步;


参考文献:

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


本文出自 “江南矿工技术空间” 博客,请务必保留此出处http://jncumter.blog.51cto.com/812546/1843990

以上是关于volatile变量的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程:volatile变量修饰符-意料之外的问题(含代码)

volatile

volatile用法

转: Java并发编程之五:volatile变量修饰符—意料之外的问题(含代码)

Java并发编程--Volatile详解

java并发编程(十五)内存可见两种方式 加锁和volatile