讓我們看看下面這段代碼在Java中揮發性VS不揮發
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? – Gilgamesz
閱讀關於它[這裏](https://stackoverflow.com/help/mcve) –