【发布时间】:2017-05-06 19:08:34
【问题描述】:
让我们考虑下面这段 Java 代码
int x = 0;
int who = 1
Thread #1:
(1) x++;
(2) who = 2;
Thread #2
while(who == 1);
x++;
print x; ( the value should be equal to 2 but, perhaps, it is not* )
(我不知道 Java 内存模型——假设它是强内存模型——我的意思是:(1)和(2)不会交换)
Java 内存模型保证对 32 位变量的访问/存储是原子的,因此我们的程序是安全的。但是,尽管如此,我们还是应该使用属性volatile,因为 *. x 的值可能等于1,因为x 可以在Thread#2 读取时保存在寄存器中。为了解决这个问题,我们应该将x 变量设为volatile。很清楚。
但是,那种情况呢:
int x = 0;
mutex m; ( just any mutex)
Thread #1:
mutex.lock()
x++;
mutex.unlock()
Thread #2
mutex.lock()
x++;
print x; // the value is always 2, why**?
mutex.unlock()
x 的值始终为2,尽管我们没有设置为volatile。我是否正确理解锁定/解锁互斥体与插入内存屏障有关?
【问题讨论】:
-
请发布 MCVE。
-
什么是 MCVE?
-
阅读它here
-
在第一个 sn-p 中,允许 HotSpot 将循环优化为
while (true),如果您让它旋转一段时间,它实际上会执行这样的优化。我认为该代码非常不安全。 -
啊,stackoverflow 不允许包含指向 lmgtfy 的链接的评论。
标签: java multithreading shared-memory memory-barriers