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

发布于 2022-09-12 03:48:28 字数 333 浏览 13 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

下雨或天晴 2022-09-19 03:48:28

你觉得它们谁先谁后呢?

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文