ホームページ  >  記事  >  Java  >  Java並行プログラミングにおける明示的ロックの詳細な説明

Java並行プログラミングにおける明示的ロックの詳細な説明

零下一度
零下一度オリジナル
2017-06-25 10:26:451483ブラウズ

明示的なロック

1. ロックと ReentrantLock

ロックは、無条件、ポーリング可能、時間指定された割り込み可能なロック取得操作を提供します。すべてのロックおよびロック解除メソッドは明示的です

ReentrantLock は Lock: を実装し、同期されたものと同じメモリ セマンティクスを提供します。 再入可能ロックセマンティクスを提供します

1. 基本セマンティクス:

void LockDefinition() {
        Lock lock = new ReentrantLock();try {//do someting//更新对象状态,捕获异常;并在必要时恢复不变性条件} finally {//finally中释放锁            lock.unlock();
        }
    }

2. ポーリングロックと時限ロック

lock.tryLock([Long, TimeUnit]): ロックの取得を試みます。時限ロック

3. 割り込み可能なロック取得操作

lock.lockInterruptibly();

2. 公平性

ReentrantLock は公平なロック(要求された順序で取得されるロック)と不公平なロック(キュー挿入可能)を作成できます。

キュージャンプ: スレッドが不当なロックをリクエストしたとき、リクエストが行われたときにロックステータスが利用可能であれば、このスレッドはキューに入れられませんが、キュー内の待機中のスレッドをすべてスキップしてロックを取得します。

注: 不公平なロックはキュージャンプを推奨しませんが、キュージャンプを防ぐことはできません; 一方、公平なロックはキューに配置され、順番に実行されます

競争が激しい場合、不公平なロックは公正なロックよりも高速です: 理由は再開するためです。キュー内のスレッド スレッドの実行開始の間に重大な遅延があります

3. 読み取り/書き込みロック

ReentrantLock は標準のミューテックス ロックですが、次のような一部のシナリオでは、読み取りと読み取りは並行して実行できますが、並行して実行することはできません。

ReadWriteLock 読み取り/書き込みロック: 実装 ReentrantReadWriteLock: メソッド readLock および writeLock

1. インタラクションおよび実装メソッド

解放優先度: 書き込みロックが解放され、キューに読み取りと書き込みの両方がある場合、それともリクエストを行ったスレッドが優先されますか?

読み取りスレッドがキューにジャンプする: 現在の読み取りロックを待機している書き込みロックがあるため、後続の読み取りロックはキューにジャンプして直接読み取る必要がありますか?直接読み取りは同時実行性を向上させますが、書き込み不足や取得の失敗を引き起こす可能性があります

再入可能性: 読み取りロックと書き込みロックは再入可能ですか?

降格: 書き込みロック、スレッドのロックをダウングレードできるように、ロックを解放せずに読み取りロックを取得できますか?

アップグレード: 待機中の他のスレッドよりも前に、読み取りロックを書き込みロックにアップグレードできますか? 2 つのスレッドが同時に書き込みロックにアップグレードしようとすると、簡単にデッドロックが発生します

主に読み取り操作であるデータ構造に適用されます

以上がJava並行プログラミングにおける明示的ロックの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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