volatile关键字

  volatile是一个特殊的修饰符,只有成员变量才能使用它,与Synchronized及ReentrantLock等提供的互斥相比,Synchronized保证了Synchronized同步块中变量的可见性,而volatile则是保证了所修饰变量的可见性。可见性指的是在一个线程中修改变量的值以后,在其他线程中能够看到这个值(在Java并发程序缺少同步类的情况下,多线程对成员变量的操作对其它线程是透明的(不可见))。因为volatile只是保证了同一个变量在多线程中的可见性,所以它更多是用于修饰作为开关状态的变量。

  java关键字volatile,从表面意思上是说这个变量是易变的,不稳定的,事实上,确实如此,这个关键字的作用就是告诉编译器,凡是被该关键字声明的变量都是易变的、不稳定的。所以不要试图对该变量使用缓存等优化机制,而应当每次都从它的内存地址中去读值。使用volatile标记的变量在读取或写入时不需要使用锁,这将减少产生死锁的概率,使代码保持简洁。

  请注意,这里只是说每次读取volatile的变量时都要从它的内存地址中读取,并没有说每次修改完volatile的变量后都要立刻将它的值写回内存。也就是说volatile只提供了内存可见性,而没有提供原子性,操作互斥提供了操作整体的原子性,同一个变量多个线程间的可见性与多个线程中操作互斥是两件事情,所以说如果用这个关键字做高并发的安全机制的话是不可靠的。

volatile的用法如下:

public volatile static int count=0;//在声明的时候带上volatile关键字即可

  什么时候使用volatile关键字?当我们知道了volatile的作用,我们也就知道了它应该用在哪些地方,很显然,最好是那种只有一个线程修改变量,多个线程读取变量的地方。也就是对内存可见性要求高,而对原子性要求低的地方。

从上面的描述中,我们可以看出volatile与加锁机制的主要区别是:加锁机制既可以确保可见性又可以确保原子性,而volatile变量只有确保可见性。

原子操作Atomic

  Volatile变量可以确保先行关系,保证下一个读取操作会在前一个写操作之后发生(即写操作会发生在后续的读操作之前),但它并不能保证原子性。例如用volatile修饰count变量,那么count++ 操作就不是原子性的。

AtomicInteger是基于sun.misc.Unsafe来实现的,其定义如下:

该类中有如下一系列方法:

其中某些方法的实现如下:

此处再介绍一下AtomicReference,其定义如下:

该类使用了泛型,在定义该类型的变量时需要指定泛型实参,如下:

public final static AtomicReference <String> ATOMIC_REFERENCE = new AtomicReference<String>("abc");

其中String即泛型实参

参考资料:

本文从概念上简单描述了java并发中volatile关键字及原子操作atomic的部分内容,此处贴出一些优质文章以供读者阅览

(1)http://www.importnew.com/18126.html

(2)http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html

(3)http://www.importnew.com/20594.html

最新文章

  1. filter之排除个别过滤
  2. 安卓app设计规范整理和Android APP设计篇(转)
  3. 《BI项目笔记》创建多维数据集Cube(1)
  4. 学习smali
  5. 黄聪:WordPress根目录(Root)
  6. Android的Eclipse升级笔记
  7. PHP 魔术方法 __isset __unset (三)
  8. linux下core文件调试方法
  9. Python:运算符
  10. jquery easy ui 学习 (7) TreeGrid Actions
  11. Mac 下卸载 Graphviz
  12. Activt工作流数据库对应表的作用
  13. Cocos2d-x 集成openinstall(Android)
  14. 在IntelliJ IDEA中,注解@Slf4j找不到log
  15. 记录一次spark连接mysql遇到的问题
  16. docker安装镜像
  17. 如何把数据快速批量添加到Elasticsearch中
  18. NO.10: 在operator=中处理 &quot;自我赋值&quot;
  19. UNIGUI上传文件
  20. 前端UED网站汇总

热门文章

  1. Access界面基础操作
  2. H264解码学习-2015.04.16
  3. SHA-1 加密算法破解现已只需要 10 天
  4. nc分析代理服务器
  5. label的for属性
  6. [麦先生]SEO--相关优化【基础】
  7. laravel administrator 一款通用的后台插件(PHP框架扩展)
  8. 蜕变&#183;WebRebuild 2013 前端年度交流会邀请
  9. C# 格式化小总结
  10. 详细说说 Google Test Certified 的各级——Level 1