2016-06-23 11 views
-1

揮発性変数を別のクラスに渡している間(どちらもスレッドクラスを拡張しています)、このvolatile変数をインポートする必要がありますか?volatile変数を別のクラスに渡すには?

例:

public class A extends Thread{ 

    public volatile int a = 0; 

public void run(){ 
    B bObj = new B(a); 
    a++; 
} 
} 

今のクラスはvolatile変数を受け、揮発性または単にパブリックとしてレシーバ変数を定義する使用する必要がありますか?このように

public class B extends Thread{ 

    public volatile int a; 

    public B(int a){ 
    this.a =a ; 
    } 
    } 

ORを次のように定義する必要がありますか?時間または他のいくつかの期間にわたって変数を交換両方のクラスと

public class B extends Thread{ 

    public int a; 

    public B(int a){ 
    this.a =a ; 
    } 
    } 

ご協力いただきまして誠にありがとうございます。ありがとう

+1

_volatileオブジェクト_のようなものはありません。それはその価値ではなく、「揮発性」である変数です。 –

+0

私は揮発性変数を意味しました。ごめんなさい。今すぐ編集します。 –

+1

それでも、メソッド引数は値であり、変数ではありません。変数(または引数式)は、値を生成するために評価されます。 _volatile_は値に適用されません。 –

答えて

0

Javaは値渡しです。 Bコンストラクタでは、Aオブジェクトのaフィールドへの参照をbObjに格納していません。値を保存するだけです。 (換言すれば、Bは、「揮発性変数を受信」でない;それはvolatileフィールドに格納することを起こるを受信して​​いる。)Aオブジェクト内aフィールドの値とBオブジェクトが値を変更することができ独立して

投稿したコードでは、A.avolatileと宣言する必要はありません。

+0

さらに、変数 'volatile'を宣言してからauto-incrementを使用すると、並行性のバグが発生します。整合性を維持するには、自動増分操作全体を同期させる必要があります。また、「スレッド」を拡張することは、単にひどい考えです。別のコメント執筆者が述べたように、 'volatile'が何を意味するのかを知ることは良い考えです。つまり、スレッド間の読み書きを調整して/起こっている/関係を維持することを意味します。 –

+0

本当にありがとうございます。 –

+0

@LewBloch - 後置インクリメント演算子に関する良い点。しかし、 'volatile'は実際には必要ではないので(少なくとも並行処理はありません)、害はありません。ちなみに、なぜ「スレッド」を拡張するのは「ひどいアイデア」ですか? (別のマルチスレッドユーティリティの代わりに) 'Thread'を使用している限り、' new Thread(Runnable) 'とほとんど変わりません。 –

関連する問題