ホームページ  >  記事  >  Java  >  Java のロック -- 同期ロックと JUC パッケージのロック

Java のロック -- 同期ロックと JUC パッケージのロック

零下一度
零下一度オリジナル
2017-06-17 14:18:311664ブラウズ

この記事は主にJava同時実行ロックの関連情報を詳しく紹介しており、興味のある友人は参照してください

ロックがJavaに追加される時間に応じて、Javaのロックは分割できます。 「同期ロック」と「JUCパッケージ内ロック」に分けられます。

同期ロック

つまり、競合するリソースへの相互排他的アクセスを実現するために、synchronizedキーワードを通じて同期が実行されます。同期ロックは Java 1.0 ですでにサポートされています。

同期ロックの原理は、オブジェクトごとに同期ロックが1つだけ存在し、異なるスレッドが共同して同期ロックにアクセスできるということです。ただし、同時に同期ロックを取得できるのは 1 つのスレッドだけです。このようにして、同期ロックを取得したスレッドは CPU によってスケジュールされ、CPU 上で実行されます。同期ロックを取得していないスレッドは、実行を続ける前に同期ロックを取得するまで待機する必要があります。これが同期ロックによるマルチスレッド同期の原理です。

JUC パッケージのロック

同期ロックと比較して、JUC パッケージのロックはより強力なロックの フレームワーク を提供し、ロックをより柔軟に使用できます。その使用法はさらに難しいだけです。

JUCパッケージのロックには、Lockインターフェース、ReadWriteLockインターフェース、LockSupportブロッキングプリミティブ、Condition、AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizerの3つの抽象クラス、ReentrantLock排他ロック、ReentrantReadWriteLock読み取り/書き込みロックが含まれます。 CountDownLatch、CyclicBarrier、および Semaphore も AQS を通じて実装されるため、これらもロック フレームワークに導入します。

まず、以下に示す錠のフレーム図を見てください。

01. ロック インターフェイス
JUC パッケージのロック インターフェイスは、さまざまなセマンティクス (再入性、公平性など) のロック ルールをサポートします。いわゆる異なるセマンティクスとは、ロックには「公平なメカニズムのロック」、「不公平なメカニズムのロック」、「リエントラント ロック」などが含まれる可能性があることを意味します。 「公平なメカニズム」は「異なるスレッドがロックを取得するメカニズムが公平である」ことを指し、「不公平なメカニズム」は「異なるスレッドがロックを取得するメカニズムが不公平である」ことを指し、「リエントラント ロック」は同じロックを指します。スレッドによって複数回取得される可能性があります。


02. ReadWriteLock
ReadWriteLockインターフェースは、Lockと同様の方法で、リーダーによって共有され、ライターによって排他的に使用できるいくつかのロックを定義します。このインターフェイスはほとんどの標準的な使用コンテキストに適しているため、JUC パッケージ内の 1 つのクラスだけがこのインターフェイス ReentrantReadWriteLock を実装します。ただし、プログラマは、非標準の要件に適した独自の実装を作成できます。


03. AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer

AbstractQueuedSynchronizer は、ロックやその他のシンクロナイザーを定義するために使用できる非常に便利なスーパークラスです。 ReentrantLock のキューイングに依存します。 、ReentrantReadWriteLock、CountDownLatch、CyclicBarrier、および Semaphore はすべて AQS クラスに基づいて実装されます。 AbstractQueuedLongSynchronizer クラスは同じ機能を提供しますが、64 ビット同期状態のサポートを拡張します。どちらもクラス AbstractOwnableSynchronizer (現在どのスレッドが排他的同期を維持しているかを追跡するのに役立つ単純なクラス) を拡張します。

04. LockSupport


LockSupport は、「ロックの作成」と「他の同期クラスの基本的なスレッド ブロック プリミティブ」を提供します。

LockSupportの機能は「Thread.suspend()とThread.resume()」に似ています。LockSupportのpark()とunpark()の機能はそれぞれスレッドをブロックし、スレッドのブロックを解除します。ただし、park() および unpark() では、「Thread.suspend および Thread.resume によって引き起こされる可能性のあるデッドロック」の問題は発生しません。


05. 状態


Condition は Lock と組み合わせて使用​​する必要があります。その機能は、Objectmonitor メソッドを置き換えることです。await() と signal() を通じてスレッドをスリープ/ウェイクアップできます。
Condition インターフェースは、ロックに関連付けられる可能性のある条件 変数 を記述します。これらの変数は、Object.wait を使用してアクセスされる暗黙的モニターと使用方法が似ていますが、より強力な機能を提供します。単一のロックが複数の Condition オブジェクトに関連付けられる場合があることに注意することが重要です。互換性の問題を避けるため、Condition メソッド名は、対応するオブジェクト バージョンのものとは異なります。

06. ReentrantLock

ReentrantLock は排他的ロックです。いわゆる排他ロックとは、それ自体でのみ占有できるロック、つまり、同じ時点で 1 つのスレッド ロックによってのみ取得できるロックを指します。 ReentrantLock ロックには、「正当な ReentrantLock」と「不公平な ReentrantLock」があります。 「公平な ReentrantLock」は「異なるスレッドがロックを取得するメカニズムが公平である」ことを意味し、「不公平な ReentrantLock」は「異なるスレッドがロックを取得するメカニズムが不公平である」ことを意味し、ReentrantLock は「リエントラント ロック」です。

ReentrantLockのUMLクラス図は以下の通りです:

(01) ReentrantLockはLockインターフェースを実装します。
(02) ReentrantLock にはメンバ変数 sync があり、sync は Sync 型であり、AQS から継承しています。
(03) ReentrantLockには「公平なロッククラス」FairSyncと「不公平なロッククラス」NonfairSyncがあり、どちらもSyncのサブクラスです。 ReentrantReadWriteLock の同期オブジェクトは FairSync または NonfairSync のいずれかです。これは、ReentrantLock がデフォルトで「公平なロック」または「不公平なロック」であることを意味します。

07. ReentrantReadWriteLock

ReentrantReadWriteLock は、サブクラス ReadLock と WriteLock を含む、読み取り/書き込みロック インターフェイス ReadWriteLock の実装クラスです。 ReentrantLock は共有ロックですが、WriteLock は排他ロックです。

ReentrantReadWriteLockのUMLクラス図は以下の通りです:


(01) ReentrantReadWriteLockはReadWriteLockインターフェースを実装します。
(02) ReentrantReadWriteLockには同期オブジェクト、読み取りロックreaderLock、書き込みロックwriterLockが含まれます。読み取りロック ReadLock と書き込みロック WriteLock は両方とも Lock インターフェイスを実装します。
(03) 「ReentrantLock」と同様に、syncもSync型であり、AQSから継承した抽象クラスでもあります。同期には、「フェア ロック」FairSync と「アンフェア ロック」NonfairSync も含まれます。

08. CountDownLatch

CountDownLatch は、1 つ以上のスレッドが他のスレッドで実行されている一連の操作を完了する前に待機できるようにする同期ヘルパー クラスです。
CountDownLatchのUMLクラス図は以下の通りです:

CountDownLatchには同期オブジェクトが含まれており、syncは同期タイプです。 CountDownLatch の Sync は、AQS を継承するインスタンス クラスです。

09. CyclicBarrier

CyclicBarrier は、スレッドのグループが共通のバリア ポイントに到達するまで相互に待機できるようにする同期補助クラスです。このバリアは待機中のスレッドが解放された後も再利用できるため、ループ バリアと呼ばれます。

CyclicBarrier の UML クラス図は次のとおりです:


CyclicBarrier には、排他的ロックを通じて実装される「ReentrantLock オブジェクト ロック」と「Condition オブジェクト トリップ」が含まれています。
CyclicBarrier と CountDownLatch の違いは次のとおりです:
(01) CountDownLatch の機能は、1 つまたは N のスレッドが他のスレッドの実行が完了するまで待機できるようにすることですが、CyclicBarrier は N 個のスレッドが互いに待機できるようにします。
(02) CountDownLatch のカウンターはリセットできませんが、CyclicBarrier のカウンターはリセットして使用できるため、サイクリック バリアと呼ばれます。

10. セマフォ

セマフォはカウントセマフォであり、その本質は「共有ロック」です。

セマフォはセマフォ許可セットを維持します。スレッドは、acquire() を呼び出すことでセマフォの権限を取得できます。セマフォに利用可能な権限がある場合、スレッドはその権限を取得できます。それ以外の場合、スレッドは利用可能な権限が得られるまで待機する必要があります。 スレッドは、release() を通じて保持しているセマフォ ライセンスを解放できます。

Semaphore の UML クラス図は次のとおりです:


「ReentrantLock」と同様に、Semaphore には sync オブジェクトが含まれており、sync は Sync 型であり、また、Sync も AQS から継承された抽象クラスです。同期には、「公平なセマフォ」の FairSync と「不公平なセマフォ」の NonfairSync も含まれます。

以上がJava のロック -- 同期ロックと JUC パッケージのロックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。