2014-08-28 31 views
2

我正在做如下,我的程序中只有2个线程。在存在volatile变量的情况下是否可以重新排序?

// Thread 1 
write a = 0 
write a = 1 
write volatile b = 1 

// Thread 2 
read volatile b // this I always do after write volatile b in the 1st thread 
read a 

我读过关于Java内存模型,从我在线程2明白read a总会给我1

我想知道这是否我的理解是否正确。

特别是可以重新排列仍然发生,所以我在第二个线程中看到a = 0?

回答

2

你的假设大部分是正确的。不过,我会稍微重申它以匹配JMM保证的内容。

如果线程2读取b,并认为价值1,那么a后续读取为1。像你说的,如果线程2“后,”线程1点结束总是读b写它,然后线程2将看到值1和a的读数将如您所料。

+0

我还是不明白为什么重新排序不能在线程中发生1.为什么a不能是0?唉,我只是不明白,请问,请告诉我JLS规范在哪里说的? – 2014-08-28 13:14:41

+0

@Alex - 链接问题的答案引用JLS。基本上,在写入易失性后,您不能将任何写入移动到任何可读取的位置,也不能将任何读取移动到易失性读取之前。 – jtahlborn 2014-08-28 13:16:33

相关问题