volatile_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > volatile

volatile

 2018/3/20 21:47:26  chen.zhu  程序员俱乐部  我要评论(0)
  • 摘要:volatilevolatile详解转载自:http://www.cnblogs.com/dolphin0520/p/3920373.html共享数据安全的三个特性:原子性,可见性,有序性。当保证了以上三个特性时,多线程并发并不会对数据造成影响。volatile能保证可见性和有序性,但是不能保证原子性。因此在有volatile修饰变量的时,在多线程编程中,要考虑到保证整体变量的原子性,才能保证共享数据的安全性。question1:volatile的工作原理是什么
  • 标签:
volatile
volatile详解转载自:http://www.cnblogs.com/dolphin0520/p/3920373.html

共享数据安全的三个特性:原子性,可见性,有序性。
当保证了以上三个特性时,多线程并发并不会对数据造成影响。

volatile能保证可见性和有序性,但是不能保证原子性。因此在有volatile修饰变量的时,在多线程编程中,要考虑到保证整体变量的原子性,才能保证共享数据的安全性

question1:volatile的工作原理是什么?
        观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令。
1:volatile保证重排序。它确保指令重排序时不会把其后面的指令排到lock标记指令之前的位置,也不会把前面的指令排到其后面;即在执行到带lock前缀的这句指令时,在它前面的操作已经全部完成。
2:volatile保证可见性。它会强制将对缓存的修改操作立即写入主存,同时会将其他线程缓存行中内容标记为无效状态,因此其他线程操作变量时,必须重新从主内存中读取变量的值。

question2:volation与synchronized的区别?
volitale与synchronized的区别:
1:volatile轻量级,只能修饰变量。
      synchronized重量级,可以修饰方法和代码块。
2:volatile只能保证数据的可见性和有序性,不能用来保证原子性,因为多个线程并发访问volatile修饰的变量不会阻塞。(不能保证原子性:要么全部执行,要么都不执行)
      synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。
上一篇: 多线程面试题 下一篇: 没有下一篇了!
  • 相关文章
发表评论
用户名: 匿名