2016-10-18 74 views
0

我有線程類有兩個變量var1var2可能會從不同的線程訪問。我們可以假設使用var2通過​​獲得和setter是一樣的使用volatilevar1沒有他們嗎?易變的變量和同步的setter和getter

public class Processor extends Thread 
{ 
    public volatile boolean var1 = false 
    private boolean var2 = false 

    synchronized boolean getVar2() 
    { 
     return var2; 
    } 

    synchronized boolean setVar2 (boolean value) 
    { 
     return var2=value; 
    } 


    public void run() 
    { 
     ... 
    } 
} 
+0

只要將變量設置爲易失性,就不能代替同步,如果這就是您要求的? – imrichardcole

+0

那個二傳手的身體背後有什麼想法? '返回var2 =值;'這是不正常的,所以需要知道你想在那裏實現什麼。 – weston

+0

另外var1是一個非最終的公共布爾值,不知道以上是真實代碼還是僅僅爲了演示一個例子,但它可能是個壞消息...... – imrichardcole

回答

1

是的,兩者相當於內存可見性。如果你必須做一些檢查然後設置,你會失去​​提供的自動性。

1

在這種情況下是的。因爲兩個同步塊都讀取和寫入值。

假設我們想要對價值變化做出反應,那就需要讀取當前值和寫入新值。爲此,volatile將不適合:

synchronized void setVar(boolean value) { 
    if (var != value) { 
    var = value; 
    someOnChangeMethod(); 
    } 
}