码迷,mamicode.com
首页 > 其他好文 > 详细

volatile变量

时间:2016-08-29 20:53:50      阅读:122      评论:0      收藏:0      [点我收藏+]

标签: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变量

标签:volatile

原文地址:http://jncumter.blog.51cto.com/812546/1843990

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!