2016-10-18 7 views
0

異なるスレッドからアクセスできる2つの変数var1var2を持つスレッドクラスがあります。 var2を​​ゲッターとセッター経由で使用することは、volatilevar1を使用した場合と同じですか?揮発性変数と同期化されたセッターとゲッター

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

そのセッターの背後にあるアイデアは何ですか? 'return var2 = value;'これは異常なので、あなたがそこで達成しようとしていることを知る必要があります。 – weston

+0

また、var1は最終的ではない公開ブール値ですが、上記のコードが実際のコードであるかどうか、または単に例を示すかどうかは不明ですが、おそらく悪いニュースです... – imrichardcole

答えて

1

はい、2つは同等のメモリ可視性です。あなたはいくつかのチェックをしなければならない場合、​​が提供する自動性を失います。

1

この場合は「はい」です。いずれの同期ブロックも値を読み書きしないためです。

値の変化に反応するとしたら、現在の値の読み取りと新しい値の書き込みの両方が必要になるとします。このため、volatileは適していない。

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