スレッドセーフなコードを作成する際に考慮すべきこと:
1. 共有変数
2. 可変変数
共有とは、複数のスレッドが同時にアクセスできることを意味し、可変とは、その値がライフサイクル中に変更できることを意味します。
たとえば、次のカウント変数は次のとおりです。
次のようにコードをコピーします。
//スレッドアンセーフなクラス
パブリック クラス UnsafeCount {
private int count = 0 //この変数は共有されます。
public void raise() { //ここには同期メカニズムはなく、複数のスレッドが同時にアクセスできます
count++; //この変数は変数です
}
public int getCount() {
戻り数;
}
}
この問題を解決するには 4 つの方法があります。
1. スレッド間で状態変数を共有する代わりに、変数をメソッドにカプセル化できます (ステートレス オブジェクトはスレッドセーフである必要があります)。メソッド内の変数は各スレッドに排他的であり、他のスレッドとは共有されないためです。例えば:
次のようにコードをコピーします。
public int add(int count){
return ++count;//ここで、ステートレス オブジェクトはスレッドセーフでなければならないとも言えます。
}
2. 状態変数を不変変数に変更します。
次のようにコードをコピーします。
プライベート最終整数カウント = 0;
3. 状態変数にアクセスするときは、同期戦略を使用します。
次のようにコードをコピーします。
public synchronized void増加() {
カウント++;
}
4. アトミック変数クラスを使用します。
次のようにコードをコピーします。
プライベート AtomicInteger カウント;
public void増加() {
count.getAndAdd(1);
}