为了账号安全,请及时绑定邮箱和手机立即绑定

细说Java多线程之内存可见性

难度中级
时长57分
学习人数
综合评分9.63
181人评价 查看评价
9.9 内容实用
9.6 简洁易懂
9.4 逻辑清晰
老师可以发下ppt吗
个人理解:不加volatile的普通变量不具有这个效果,比如线程对工作变量修改完之后,不会百分百对主内存也修改,有可能改完自己工作变量后休眠了,一直不去对主内存中的变量进行修改。但是线程对volatile变量会绑定对主内存变量也修改的操作,也可以说对volatile变量的修改 有一个 “对自己工作区变量修改并且绑定了一个对主内存变量修改”的原子性的操作。
个人一个比较浅显的理解就是:
synchronized就是互斥锁,实现底层就是总线锁,当一个线程获得该锁时,其他线程就会进入阻塞状态,从而不能进行操作。
而volatile则不同,它有点像缓存锁,但是又不像锁。volatile变量在执行写操作时,会加入store的屏障指令,我的理解是这时其他线程不能能对该共享变量做出任何操作,但是可以操作其他共享变量。这时volatile的开销就比synchronized小。

最赞回答 / 慕前端6229441
共享变量是在多线程操作的情况下,对某一个变量都有进行操作,该变量存储在主存中,但是在多线程的工作内存中都有一个副本,所以该变量是共享的,即为共享变量。 volatile变量是被该关键字修饰的变量。在单线程中也可以用来修饰变量,但是没有意义。用在多线程中,是为了保证被其修饰的变量对于多线程来说都是内存可见的。 在多线程中,volatile用来修饰共享变量,实现共享变量的可见性。
讲的不错,受教了!

已采纳回答 / 自有如风
你看看这样能不能理解:number的值可以存在三个地方:主内存,cpu缓存,cpu寄存器。因为加上了volatile关键字,cpu每次对number的读取都强迫cpu缓存从主内存中读取。但是count++操作有三步,读count,计算count+1,将计算的结果给count。假设读count已经执行了,number已经放到了cpu寄存器中。此时当执行权被其他线程抢走之后再次轮到当前线程执行的时候,已经不需要再读number了。故number还是没有变化
讲得很好!受教了
看到有人评论加入synchronized后仍然有0出现的问题。
我的理解是:synchronized的作用是保证同步代码块中只能有一个线程在访问,另外在访问的时候,其他线程 不能访问 其他synchronized同步代码块。所以结果有 0 和 6,是正常的。
加 synchronized 并不能解决结果可能出现 0 的问题,有点误人子弟啊
volatile 能实现可见性 但是 synchronized 只能实现线程安全吧

已采纳回答 / 一叶秋才
这个Dome告诉你 编译时可能存在其它结果,导致数据不安全
public static void main(String[] args) {
    SynchronizedDemo synchronizedDemo=new SynchronizedDemo();

       synchronizedDemo.new ReadWriteThread(true).st...

已采纳回答 / 我是猫_夏
互斥锁,同一时间,只能 有一个线程持有该对象的引用,对该对象进行操作
老师幸苦了
非常感谢老师!老师受累了!
赞讲的太好了
课程须知
学习本课程前,你需要熟练掌握Java的基础语法,熟悉Java多线程的基础知识,以及synchronized实现线程同步的方法。
老师告诉你能学到什么?
1、内存可见性 2、指令重排序 3、as-if-serial语义 4、synchronized实现可见性 5、volatile实现可见性

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?

举报

0/150
提交
取消