2016-07-21 3 views
1

スレッドセーフなプロジェクトのプログラミング時に、どのフィールドをスレッドセーフにするかを決定する方法。たとえば、マルチスレッドプロジェクトでは、TestThreadSafeというプロジェクト内にクラスがあります。スレッドセーフなインスタンスフィールド

public class TestThreadSafe { 
    public AtomicLong pCounter = new AtomicLong(); 
    public AtomicLong mCounter = new AtomicLong(); 
    protected final ConcurrentMap<K, V> Map = new ConcurrentHashMap<K, V>(); 
    private ScheduledExecutorService ses; 
    private String dir; 
} 

ここで、最終フィールドまたは揮発性フィールドとしてsesとdirを定義しないのはなぜですか?

+0

これらのフィールドの使用方法はわかりません。それらがマルチスレッドコンテキストで使用されない場合、volatileは必要ありません。参照を変更しない場合は、finalは必要ありません。 –

+0

TestThreadSafeはマルチスレッドコンテキストで使用されます – lawrence

答えて

0

フィールドを常にfinalとマークするとよい(パフォーマンスを失うことはないが、コンパイル時間のチェックとスレッド関連のボーナス - フィールドは常にデフォルト値ではなく値を与えられる)。

volatileについては、CPUの最適化(キャッシュ)がなくなるため、このようなフィールドの使用が遅くなります。

volatileは、スレッド間で指定されたフィールド値を共有する場合に使用する必要があります。つまり、1つのスレッドがデータを書き込んでおり、複数の(> = 1)スレッドが読み込みます。

+0

インスタンスフィールドの変数について混乱します。フィールドはfinal、volatileまたはインスタンスフィールド変数の前に宣言する必要があります。どのように決定し、どのように決定するか、それを行うためのいくつかの基準はありますか? – lawrence

+0

javaがあれば標準はありません。あなたは自分で決めるコードの終わりを見る必要があります。私は個人的にどこでも最終修飾子を追加し、コンストラクタのフィールドを初期化します。 –

0

キーノート:あなたの変数の参照が作成後に変更されない場合は

  1. あなたの変数が複数のスレッドによって変更されていない場合は、何も
  2. を使用していない、あなたの変数がある場合final
  3. を使用volatile
  4. 変数が変更され、複数のスレッドによってアクセスされる場合は、次のようになります。 a。スレッドによって変更され、他のスレッドによってアクセスされます。操作がアトミック - シングルステップトランザクションの場合AtomicXXXを使用してください。 b。

    What is the difference between atomic/volatile/synchronized?

    What is meant by "thread-safe" code?

    :あなたは

を守らなければ、コードブロックを持っている場合は、ハイレベルの同時実行性についての詳細はhere

関連SEの質問を構築見つけることができます​​またはLock APIを使用します

関連する問題