Javaスレッドセーフとは何ですか。
スレッドの同期がある手段であることとき、彼はもはや動作しないことができ、かつスレッドセーフなメソッドにアクセスするために訪問の終了後まで待たなければならない他のアクセスや文のスレッドセーフな方法で、上のプログラム
何がスレッドセーフであります:
プロセスが同時に実行されている複数のスレッドを持っており、これらのスレッドが同時にこのコードを実行することができ、あなたのコードの場合。それぞれの結果はシングルスレッド業績と同じ、また、他の変数の値を実行し、期待が同じである場合、それは、スレッドセーフです。
または:スレッド間の切り替えのために提供されるクラスやプログラムのインタフェースは、アトミック操作または複数のスレッドが、我々は同期の問題を考慮していないことを意味インターフェイスの実装の曖昧な結果の存在にはなりませんです。
スレッドの安全性の問題は、グローバル変数と静的変数によって引き起こされます。
グローバル変数、静的変数への各スレッドは、読み取り専用の場合、書き込み動作は、一般的には、グローバル変数はスレッドセーフではありません。複数のスレッドが同時に書き込み操作を実行する場合、一般的に、他のスレッドの同期を考慮する必要があり、またはどのスレッドの安全性に影響を与える可能性があります。
操作は、彼のような要素を追加するように修正同期の追加である知っている彼の学生の多くのベクトルのソースを読みます。(私は自己同期のBaiduの意味があるのか分かりません!)
1
2
3
|
公共同期ボイドはaddElement(EのOBJ){modCount ++;
ensureCapacityHelper(し、elementCount + 1)。elementData [し、elementCount ++] = OBJ。
}
|
彼は、ソースを置くと、すべての操作に加えて、同期のHashMapは、変更されません
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
パブリックVプット(Kキー、V値){
(キー==ヌル)の場合
リターン
putForNullKey(値)。
INTハッシュ=ハッシュ(key.hashCode())。
int型I = indexFor(ハッシュ、table.length)。
{(!; E =ヌルE = e.next [i]を入力<K、V> E =表)のために
オブジェクトK;
IF(e.hash ==ハッシュ&&((K = e.key)==キー|| key.equals(K))){
V OLDVALUE = e.value。
e.value =値。
e.recordAccess(この);
リターン
OLDVALUE; }
}
modCount ++;
addEntry(ハッシュ、キー、値、I);
ヌルを返します。
}
|
ソースコードを見てのArrayListのメソッドを追加
1
2
3
4
5
|
パブリックブールの追加(E電子){
ensureCapacity(サイズ+ 1)。//インクリメントmodCount !!
elementData [サイズ++] = E。
trueを返します。
}
|
StringBufferのソースコードを見て追加し、彼は修正同期しています
1
2
3
4
5
|
公共の同期化
StringBufferのはappend(文字列str){
super.append(STR)。
これを返します。
}
|
setPropertyメソッドの最後のプロパティは、彼は修正同期しています
1
2
3
4
5
|
公共の同期化
オブジェクトのsetProperty(文字列キー、文字列値){
リターン
(キー、値)に置きます。
}
|
したがって、スレッドセーフである者を決定することができます
いわゆる揮発性対策、
1.メモリからの各値ではなく、キャッシュから値を取るために何か。これは、他のスレッドの更新の各々が表示されて、共有変数の揮発性修飾を確実にします。
他のスレッドの即時視認性を確保するために揮発性2.保証のアトミック性はありません。
時々揮発操作は保存されませんので3は、説明は閉塞を引き起こすことはありません。マルチスレッド環境での使用不可カウンタ
volatile宣言された後の共有変数(クラス、静的メンバ変数のクラスのメンバ変数)したら、2つの意味を持っています:
スレッドは、変数の値を変更する。この可変操作、異なるスレッドが、他のスレッドにこの新しい値が直ちに表示されている場合1)の視認性を確保します。
2)禁止命令の並べ替え。
変数にアクセスするための保証を提供するためにのみ揮発性、毎回、メモリから最新の値を読み、レジスタの値をキャッシュするために使用されることはありません - メモリから読み出されるたびに。
そして、揮発性の修正変数は、保証の原子を提供していません。
更新がないループの外に、変数の最新の値に別のスレッドへのアクセスにつながる可能性があるので、
マルチスレッドロック保護はカウンターの下に使用しなければなりません。