AQS学習記録:いくつかの雑多な個人の理解

699 ワード

AQS各人理解:
一、スレッドがCLH同期キューに追加された後、いつデキューされますか?
relase()メソッドのソースコードから、現在のスレッドのロックを解放し、後続のキャンセルされていないノードを起動し、現在のスレッドをCLHキューから移動しなかったことが2つしか行われていないことがわかります.では、現在のロックスレッドはロックを解除した後、いつ本当にキューを出たのでしょうか.
リリース時にキューが出ていない以上、後続ノードがロックを取得する流れを見てみましょう.すぐに、私たちはacquireQueued(final Node node, int arg)には、現在ロックを取得しているノードをキューのHEADに設定するコードが発見されている.これにより、ロックを解除したHEADノードは自然にデキューされ、新たにロックを取得したノードはHEADヘッダノードに昇格する.ここで、CLHキューにおいて、ロックを保持しているノードはHEADノードのみであることが分かる.~~~~
  if (p == head && tryAcquire(arg)) {
                    setHead(node);
                    p.next = null; // help GC
                    failed = false;
                    return interrupted;
   }