JAva同時キュー同期器

2651 ワード

、注:自分の理解だけで整理するこまごました知識点(ゆっくり補充)
JAvaにおける同期ロックの実装は内部のキュー同期器に依存し,キュー同期器を実装して同期状態を取得し,同期状態を解放する方法を継承する.
キュー・シンクロナイザの内部では、intメンバー変数stateによって同期の状態占有または解放(共有および排他を含む)を表し、スレッドが同期状態の取得に失敗すると、現在のスレッドは、同期器のFIFOキューにノードが追加され、現在のスレッドがブロックされるように構成され、同期状態が解放されると、ヘッダノードのスレッドが起動し、同期状態の取得を再試行します.同期カラム内のノードには、同期状態の取得に失敗したスレッド参照、待機状態、および前駆ノードと後続ノードが保存されます.
同期ステータスの取得に失敗しました:
同期器には、1つのスレッドが同期状態(ロック)を取得すると、他の同期状態を取得しようとするスレッドは同期状態を取得できず、ノードが同期器の同期キューの末尾に追加されるように構成されるヘッダノードと末尾ノードがある.このプロセスは,複数のスレッドが同時に末尾への追加を要求する可能性があり,末尾ノードの挿入が原子的であることを保証し,CAS操作を用いて完了する必要がある.
最初のノードの同期状態の解放:
先頭ノードが同期同期状態を解放すると、後続ノードが起動し、後セットノードが同期状態を取得するのに成功すると、先頭ノードが自分で設定されます.このプロセスでは、1つのラインだけが同期状態を取得することに成功します.したがって、最初のノードを設定するには、CAS操作を保証する必要はありません.
Condition実装:
同期器の内部クラスとして、conditionの操作はまず対応するロックを取得する必要があるため、各conditionは待機キューを含み、キュー内の各ノードはそのconditionオブジェクトに待機するスレッドを表し、ロックスレッドを取得してawait()を実行し、ノードを待機状態にする.待機キュー・セクションでは、同期キューのノード・タイプが多重化されます.同期状態を取得してawait()メソッドを直接呼び出さない場合、ロックを解除するとき、ノード状態stateのデフォルト値は0ですが、同期状態が取得されたことを示します.ただし、同期状態を取得する情報が事前に取得されていないため、解放時に同期状態を持つスレッドが現在のスレッドではないことを確認して異常を放出する.(同期されていないコードブロックでは同期状態を取得および解放する操作は不要)、
protected final boolean tryRelease(int releases) {
    int c = getState() - releases;
    if (Thread.currentThread() != getExclusiveOwnerThread())
        throw new IllegalMonitorStateException();
    boolean free = false;
    if (c == 0) {
        free = true;
        setExclusiveOwnerThread(null);
    }
    setState(c);
    return free;
}
conditionオブジェクトには、待機キューがあり、キューの末尾ノードと先頭ノードの追加と削除にはCASが原子性を保証する必要はありません.conditonを操作するスレッドはすでにロックを取得しているため、ロックによってスレッドの安全性が保証されます.