データを同時に共有し、一貫性を確保するためのツールとして、ロックは JAVA プラットフォーム上に複数の実装があります (synchronized ロックや ReentrantLock など)。これらの既に書き込まれたロックは開発に便利ですが、ロックの具体的な性質や種類についてはほとんど言及されません。このシリーズの記事では、JAVA での一般的なロック名と特徴を分析して、質問に答えます。
ブロックロック
ブロッキング ロックは、スピン ロックとは異なり、スレッドの実行状態を変更します。
JAVA 環境では、スレッド Thread は次の状態になります。
1. 新しい状態
2.準備完了状態
3. 運転状況
4. ブロック状態
5. 死亡状態
ブロッキング ロックは、スレッドがブロッキング状態になって待機することを可能にし、対応する信号 (ウェイクアップ、時間) が取得されると、レディ状態にあるすべてのスレッドが実行状態に入ることができます。競争を通じて。
JAVA では、開始/終了、ブロック状態、またはブロック ロックを含めることができるメソッドには、同期キーワード (重み付けロック)、ReentrantLock、Object.wait()/notify()、LockSupport.park()/unpart()(ジュースがよく使われます)
以下は、JAVA ブロック ロックの例です。
パッケージ ロック;import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;import java.util.concurrent.locks.LockSupport;public class CLHLock1 { public static class CLHNode { private volatile Thread isLocked } @SuppressWarnings("unused") private volatile CLHNode末尾; プライベート静的最終 ThreadLocal<CLHNode> LOCAL = 新しいThreadLocal<CLHNode>(); private static Final AtomicReferenceFieldUpdater<CLHLock1, CLHNode> UPDATER = AtomicReferenceFieldUpdater(CLHLock1.class, CLHNode.class, "tail") { CLHNode ノード = new CLHNode(); .set(ノード); preNode = UPDATER.getAndSet(this, ノード); if (preNode != null) {preNode.isLocked = Thread.currentThread() } } void lock() { CLHNode ノード = LOCAL.get() if (!UPDATER.compareAndSet(this, ノード, null)) { System.out.println("unlock/t" + node.isLocked.getName()); } ノード = null;
ここでは、LockSupport.unpark() のブロック ロックを使用します。 この例は CLH ロックから変更されています。
ブロック ロックの利点は、ブロックされたスレッドが CPU 時間を占有せず、過剰な CPU 占有を引き起こさないことですが、エントリ時間と回復時間がスピン ロックよりもわずかに遅いことです。
激しい競争の場合、ブロッキング ロックのパフォーマンスはスピン ロックのパフォーマンスよりも大幅に高くなります。
理想的な状況は、スレッドの競合が激しくない場合にはスピン ロックを使用し、競合が激しい場合にはブロッキング ロックを使用することです。
(全文終わり)