Java同時プログラミング実戦-基礎知識-スレッドセキュリティ

1480 ワード

スレッドの安全なコードを記述するには、ステータス・アクセス・オペレーション、特に共有および可変のステータスへのアクセスを管理することが核心です.
「共有」は、変数に複数のスレッドの同僚がアクセスできることを意味し、「可変」は、変数の値がライフサイクル内に変化を送信できることを意味します.
Javaの主な同期メカニズムはキーワードsynchronizedであり、独自のロック方式を提供しているが、「同期」という用語にはvolatileタイプの変数、表示ロック(Explicit Lock)、および原子変数も含まれている.
スレッドセキュリティとは
複数のスレッドがクラスにアクセスする場合、実行環境がどのようなスケジューリング方式を採用しているか、またはこれらのスレッドがどのように交互に行われるかにかかわらず、プライマリ・コール・コードに追加の同期や協同を必要とせず、このクラスは正しい動作を示すことができ、このクラスはスレッドが安全であると呼ばれます.
正確性:クラスの動作はその仕様と一致します.
げんしせい
競合条件(Race Condition):ある計算の正確性が複数のスレッドの交互実行のタイミングに依存する場合、競合条件が発生する.
最も一般的な競合条件のタイプは「チェックしてから実行(Check-Then-Act)」操作であり,すなわち失効する可能性のある観測結果によって次の動作を決定する.
public class LazyInitRace{
    private ExpensiveObject instance = null;
    
    public ExpensiveObject getInstance() {
        if(instance == null) {
            instance = new ExpensiveObject();
        }
        return instance;
    }
}

スレッドAがgetInstanceを呼び出したときにinstanceがnullであることを検出すると、まだ作成に成功していない前にスレッドBもgetInstanceを呼び出し、instanceもnullであることを検出すると、両方のスレッドが新しいインスタンスを作成すると仮定すると、この2つの呼び出しは異なる結果を得る可能性があります.
引用書の定義:2つの操作AとBがあると仮定し、Aを実行するスレッドから見ると、別のスレッドがBを実行すると、Bを完全に実行するか、Bを完全に実行しないかで、AとBは互いに原子である.原子操作とは、同じ状態にアクセスするすべての操作(その操作自体を含む)に対して、この操作は原子的に実行される操作である.
私が理解しているのは、1つの変数の操作セットに対して、実行しないか、すべて実行し終わるか、この操作セットは原子方式で実行されます.
内蔵ロック
さいにゅう
スレッドビューがすでに自分で所有しているロックを取得すると、このリクエストは成功します.
再読み込みは、ロックを取得する操作の粒度が「呼び出し」ではなく「スレッド」であることを意味します.再読み込みの一実施形態は、各ロックに対して1つの取得カウント値と1つの所有者スレッドを関連付けることである.