volatile变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了volatile变量相关的知识,希望对你有一定的参考价值。
volatile英文含义为易变的,是java的一个关键字,可以实现同步的部分功能。volatile可以看做轻量级的synchronized。synchronized可以实现同步的可见性和原子性。volatile只可以实现可见性,即保证多线程的每次读取操作均可以读到最新的值;因未实现同步的原子性要求,不可用于类似于计数器(++x)这样的写操作(读、写、存储)。in short,volatile可以用于的场景如下:
变量的最新状态不依赖于之前的任一状态,比如++x即不适用;
该变量也没有包含在其他变量的不变式中;
可用典型场景: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变量修饰符-意料之外的问题(含代码)