关于Javac 多线程程的几点疑问,求助大佬

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
Java 多线程的线程安全需要保证原子性和可见性,volatile 关键字可以保证可见性不能保证原子性,synchronized 关键字可以保证可见性和原子性,不过有几点疑问请教一下大佬:
(1)volatile 关键字如何保证的可见性,在书上和博客上看到了两种不同的说法,不知道哪种正确:
1.赋值操作后会立即写回主内存,一个线程数据回写到主内存会导致其他线程对应数据无效(通过嗅探总线上传输的数据检查自身数据),线程下次使用时若发现自身数据失效,则会从主内存上取数据更新;
2.线程中每次 use 变量时,都需要连续执行 read-&load-&use 几项操作保证使用的数据是最新的,线程每次 assign 变量时,都需要连续执行 assign-&store-&write 几项操作,保证赋值后立即写回主内存;
(2)未使用 volatile 关键字的普通变量赋值后工作内存写回主内存的时机: volatile 关键字修饰的变量赋值语句后会立即写回主内存,普通变量赋值修改后什么时候写回主内存呢,是当一个方法执行完后吗?
(3)volatile 使用内存屏障解决指令重排序带来的线程安全问题,synchronized 是怎么解决指令重排序带来的线程安全问题的呢?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
其实运用volatile关键字主要解决的问题是:主存和私有内存共享变量不同步的问题,
(1)在JMM(内存模型)中私有内存也就是本地内存存储的是共享变量的副本,线程进行操作时,先把主存中的共享变量刷新到本地内存中,当本地内存共享变量副本更新后,又将共享变量副本的值刷新到主存中,volatile关键字使用,保证了可见性,强制从主存中获取共享变量的值。
(2)个人认为普通变量和volatile的写回内存的时机是一致的,使用volatile解决的是本地内存和主存变量不一致的问题,只是用volatile修饰的变量是强制从主存中获取变量值,而普通变量是从本地内存中获取变量值
(3)第三点由于个人能力还不够 暂时不能回答
以上都是个人总结的观点,若有说错的地方 还请原谅
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。

我要回帖

更多关于 c 多线程 的文章

 

随机推荐