有了cpu的mesi协议,java程序中为什么还会存在线程可见性问题?
mesi协议会对线程间的共享变量设置标记,如果当前线程缓存行内的共享变量被其他线程修改,当前缓存行内的共享变量会被设置为无效(Invalidate),那么再次用到这个变量时会从主内存中读取最新值。既然是这样,为什么我在编写java程序时,不使用 volatile关键字仍然会有线程间的可见性问题?
例如:一个线程进行死循环,循环内对共享变量flag进行判断若为true则跳出循环(初始为false),另一个线程在线程1进行循环后将flag设置为true,此时最开始的线程仍读flag为false一直死循环
疑问:不是已经由cpu的缓存一致性协议保证了可见性的问题了吗?为什么此时一个线程仍然读不到另一个线程修改共享变量后的最新值呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你觉得它们谁先谁后呢?
而且 MESI 是针对多核而言的,你猜单核时多线程 MESI 还有用吗?
知乎上有相关的讨论,可以看这里:https://www.zhihu.com/questio...