synchronized保证可见性,原子性,近朱者赤 问题?

来源:13-6 可见性

油腻!

2019-09-20

图片描述这里首先在change方法中对d=6进行赋值的时候使用synchronized进行加锁。然后在print方法中对a进行赋值的时候。也首先进行加锁。这样的代码能实现什么效果?并不能保证第二个线程在打印的时候第一个线程执行完change方法并对a,b,c,d完全赋值成功?可能在change方法的执行的时候,刚刚执行c=5,还没执行synchronized(this){ d = 6;}.这个时候cpu切换到另一个线程中,另一个线程一定能获取到对应的锁。然后进行执行。那么int dd = d;就有可能出现不是预期的效果?

不太理解老师这个例子是想怎样表达可见性的?用volatile 修饰,使用触发器的方式还是可以理解的。另一个线程在执行的时候先有判断的。这里该怎么理解

写回答

1回答

悟空

2019-09-20

对,这里想表达的和volatile类似,前提是如果d=6已经执行了,那么a b c的最新值下面的print都能看到。这里只是顺带把synchronized的可见性说一下,实际中会采用volatile的触发器来实现。

3
0

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程