2017-09-05 70 views
1

我在java中有一個讀寫器線程,下面是代碼片段。在java中註冊非易失性變量的配置

int volatile ready = false; 
int var1; 
int var2; 
int var3; 

T1: 
while(!ready); 
    print var1; 
    print var2; 
    print var3; 


T2: 
var1 = 1; 
var2 = 2; 
var3 = 3; 
ready = true; 

是否有可能在T2的寄存器中分配var1,var2和var3。 在C++中,這是通過將var1,var2和var3標記爲volatile來防止的。 但是在Java中,這些變量是否也需要標記爲volatile?

+0

'volatile'是不是在C線程同步機制++;即使對所有變量都使用volatile,這種模式在C++中也是不安全的。 – user2357112

+1

另外,您的T1 *在設置了ready標誌時停止*打印變量,而不是在打印之前等待T2設置標誌。 – user2357112

+0

編輯了問題 – KodeWarrior

回答

1

但是在Java中,這些變量是否也需要標記爲volatile呢?

如果您只關心它們的值是否對T1可見,否則不需要爲volatile

由於readyvolatile,JSR 133保證T2的寫入和T1的讀取之間發生之前的關係。

查看在FAQ詳細的說明:https://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile

+0

我通過文檔閱讀並瞭解在關係之前發生了一件事。這是否意味着在進行易失性寫入之前沒有對所有非易失性變量進行寄存器分配,或者是否存在寄存器分配,但是這些值被移動到變量的存儲位置,並且最終由於由易失性寫入引入的柵欄而被刷新? – KodeWarrior

+0

@KodeWarrior:我從來沒有見過Java運行時或JIT編譯器向用戶保證它放置變量的位置。保證傾向於關於可觀察的語義。如果你真的關心你的運行時間,看看反彙編(https://stackoverflow.com/questions/1503479/how-to-see-jit-compiled-code-in-jvm)。 – NPE

+0

好的,從可見性的角度來看是有道理的。謝謝,NPE。 – KodeWarrior