Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
466 views
in Technique[技术] by (71.8m points)

有了cpu的mesi协议,java程序中为什么还会存在线程可见性问题?

mesi协议会对线程间的共享变量设置标记,如果当前线程缓存行内的共享变量被其他线程修改,当前缓存行内的共享变量会被设置为无效(Invalidate),那么再次用到这个变量时会从主内存中读取最新值。既然是这样,为什么我在编写java程序时,不使用 volatile关键字仍然会有线程间的可见性问题?
例如:一个线程进行死循环,循环内对共享变量flag进行判断若为true则跳出循环(初始为false),另一个线程在线程1进行循环后将flag设置为true,此时最开始的线程仍读flag为false一直死循环
疑问:不是已经由cpu的缓存一致性协议保证了可见性的问题了吗?为什么此时一个线程仍然读不到另一个线程修改共享变量后的最新值呢?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

你觉得它们谁先谁后呢?

而且 MESI 是针对多核而言的,你猜单核时多线程 MESI 还有用吗?

知乎上有相关的讨论,可以看这里:https://www.zhihu.com/questio...


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...