どうすることを保証するため、複数のスレッドで安全にアクセスクラスす。
-
02-07-2019 - |
質問
クラス分野を通じてアクセスでgetterメソッドによる複数スレッドをどのように維持すスレッドの安全性?の同期をキーワードで十分か?
この安全:
public class SomeClass {
private int val;
public synchronized int getVal() {
return val;
}
private void setVal(int val) {
this.val = val;
}
}
又は、セッター、さらに合併症?
解決
ご利用の場合は同期化して、セッターがこのコードはthreadsafe.しかしなが十分細;場合は20setterか、セッターそれらはすべて同期されますので、作の同期がボトルネックです。
この特定のインスタンスは、単一のint変数は、その除去を同期化して、マーキングのint field'揮発性"をも視認性確保のた(それぞれのスレッドの最新の値はのval'を呼び出す時には、ゲッター)では同期化されないことがあります十分にお任せください。例えば、期待し
int old = someThing.getVal();
if (old == 1) {
someThing.setVal(2);
}
設定値の2の場合だけで1が間違っています。この必要な外部ロック、または一部の原子を比較し、設定方法です。
いっ読む Java並行処理で実際に によるブライアンGoetz et al, での範囲のJavaの並行処理を構築します.
他のヒント
私の理解のものを使用できる同期の両方のゲッターの設定機能メソッドでは十分です。
編集:こちらは リンク からの情報を同期ではないのかについて
クラスアップした場合、を含んで変数、その達成のスレッドの安全性は、既存のAtomicIntegerオブジェクトです。
public class ThreadSafeSomeClass {
private final AtomicInteger value = new AtomicInteger(0);
public void setValue(int x){
value.set(x);
}
public int getValue(){
return value.get();
}
}
ただし、追加変数にも依存性(状態の変数に依存する状態でも、AtomicIntegerいます。
コへのご提案を読む"Javaセンター
のための簡単なオブジェクトのこあります。ほとんどの場合どうしたらよいかということですので同期をキーワードが合同期デッドロックします。
例:
public class SomeClass {
private Object mutex = new Object();
private int val = -1; // TODO: Adjust initialization to a reasonable start
// value
public int getVal() {
synchronized ( mutex ) {
return val;
}
}
private void setVal( int val ) {
synchronized ( mutex ) {
this.val = val;
}
}
}
保証する唯一のスレッドを読み込みや書き込み、現地のインスタンス。
本を読んで"同時プログラミングJava(tm):デザイン原理とパターン(Java(Addison-Wesley))"か http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html でも...
同期の存在を保護するためのスレッドの干渉およびメモリの整合性。による同期させgetVal()をコードすることを保証するその他の同期方法SomeClassなにも実行でも同時に行います。そのため、その同期方法で提供するもの値です。また、読み込みおよび書き込みにプリミティブにおいて原子がアクセスするこれを行うプログラミング、一る必要はありませんの同期、アクセスの分野です。
読む Sychronization.
すごく落と-3.私は単にまとめの同期のチュートリアルからの日という(そして自分。
簡単な原子変数にアクセス より効率的アクセスしこれらの 変数を同期化コード が必要とされるケアの プログラマを回避記憶の一貫性 ます。るかどうかの努力が 価値あるサイズに応じ、 複雑さのものに限ります。