在开始解释Java多线程缓存模型之前睡眠睡眠2秒钟,线程2执行。两个线程使用false的初始值使用共享变量共享Flag。如果ShareFlag始终等于false,则线程1始终处于死周期中,因此我们将共享Flag设置为在线程2中为true。
如果您尚未了解JMM线程模型,则可能已经阅读了上面的代码,并且要获得的输出结果如下:
如下图所示,普通人理解此代码,首先执行线程1进入周期,线程2修改shareflag = true,而线程1跳出周期。因此,从周期跳出的线程1将打印“螺纹1执行=>”,但是在作者的实验之后,“线程1”执行=>“不会打印,线程1没有跳出死周期。为什么?
为了解释上述问题,我们需要学习JMM(Java内存模型)Java内存模型。作者认为它被称为Java多线程内存模型。
根据上述实验和JMM模型,无法感知由线程2修改的共享变量的值。因此,线程1的值如何感知共享变量的值?实际上,它也很简单。要共享ShareFlag的变量,请添加波动性关键字。
底部原理就是这样,加上挥发性关键字提示JMM遵循MESI缓存一致性协议。该协议包含以下缓存使用规格(如果您不了解,则无法查看。以下将以简单的语言和示例描述)。
上述缓存的代码可能太复杂了。简而言之,这是
推荐阅读“并行编程列”
本文复制来源(必须连接,您不仅要切换到文本):Letters Brother Blog- Zimug.com
原始:https://juejin.cn/post/7096630335651184647