摘要:在学习JAVA语言时,我们要了解共享数据安全的三个特性:原子性,可见性,有序性。 当保证了以上三个特性时,多线程并发并不会对数据造成影响。 volatile能保证可见性和有序性,但是不能保证原子性。因此在有volatile修饰变量的时,在多线程编程中,要考虑到保证整体变量的原子性,才能保证共享数据的安全性。 让我们在JAVA语言的路上能够越走越远。
共享数据安全的三个特性:原子性,可见性,有序性。
当保证了以上三个特性时,多线程并发并不会对数据造成影响。
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锁对象时,会出现阻塞。
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言JAVA频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号