ホームページ Java &#&チュートリアル Java のロック -- 同期ロックと JUC パッケージのロック

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

Jun 17, 2017 pm 02:18 PM
java 同期する

この記事は主に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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Feb 07, 2025 pm 12:11 PM

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。

See all articles