一般的なロック戦略
みなさん、こんにちは。この記事では、マルチスレッドでの一般的なロック戦略を紹介し、6 種類のロックについて説明します。
- 楽観ロック VS 悲観ロック
- 通常のミューテックス VS 読み書きロック
- 重量ロック vs 軽量ロック
- スピンロック VS 保留待ちロック
- フェアロック VS アンフェアロック
- 再入可能ロックと再入不可ロック
- 一般的な面接の質問
一般的なロック戦略については、これはインタビューでテストするのが大好きなコンテンツですが、仕事には必要ありません.理解して
覚えることができます.視聴効果を高めるために、これにジャンプすることを
お勧めします.私も前回の記事のリンクはこちら。
子犬は、みんなを飲みに誘うと言ったので、すぐに「ありがとう、子犬」と言ってください。
一般的なロック戦略
ロック戦略とは: ロックを追加するとき、どのように追加するのですか
? ここで言及されているロック戦略は基本的に言語とは関係なく、他の言語にも「ロック戦略」が含まれます。
1. 楽観ロック VS 悲観ロック
楽観的ロック: 次のロック競合の確率が高くないと予測する場合、1 つのタイプの操作を行う必要があります
悲観的ロック: 次のロック競合の可能性が高いと予測する場合、別のタイプの操作を行う必要があります
栗を取ってください:
流行により学校が閉鎖されました
. 緊張している人もいます. スナックを買いにスーパーマーケットに行く -> 楽観的な
ロック
.
楽観的ロックは比較的コストが低く、悲観的ロックは比較的コストが高い
以前に同期を導入しました.悲観的ロックと楽観的ロックの両方、つまり適応ロックです.現在
のロックの競合確率は高くなく、楽観的ロックモードで実行されます.多くの場合、純粋なユーザーモードで実行されます. .
ロックの競合が大きいことが判明すると、ペシミスティック ロック モードで実行するには、多くの場合、カーネルに入ってサスペンドし、現在のスレッドを待機する必要があります。
2. 通常のミューテックス VS 読み書きロック
Synchronized は通常のミューテックスであり、2 つのロック操作は競合を引き起こします
読み取り/書き込みロックは、ロック操作を改良し、「読み取りロック」と「書き込みロック」に分割します.
ケース 1:
スレッド A が書き込みロックを追加しようとし、
スレッド B が書き込みロックを追加しようとする.
スレッド A とスレッド B通常とは競合する ロックに違いはないケース
2:
スレッド A が読み取りロックを追加しようとし、スレッド
B が読み取りロックを追加しようとする
スレッド A とスレッド B が競合せず、スレッド B が競合しない(マルチスレッド読み取り
、変更を伴わず、スレッドセーフです。)
3:
スレッド A が読み取りロックを追加しようとします。
スレッド B が書き込みロックを追加しようとします。
スレッド A とスレッド B が競合しますが、これは通常のロックと同じです。
ケース 2 (両方のスレッドが読み取りロック) のみがスレッドセーフです
読み書きロックとは、読み取り操作と書き込み操作を別々に扱うことであり、Java 標準ライブラリはReentrantReadWriteLock
、読み書き
ロックを実装するためのクラスを提供します。
ReentrantReadWriteLock.ReadLock
クラスは読み取りロックを表します。このオブジェクトは、ロックおよびロック解除するlock / unlock
メソッドを。ReentrantReadWriteLock.WriteLock
クラスは書き込みロックを表します。このオブジェクトは、ロックおよびロック解除するlock / unlock
メソッド。
3. 重量ロック VS 軽量ロック
重いロックは、ロックのコストが比較的大きく、より多くの作業が行われることを意味します。
軽量ロックは、ロックのコストが比較的小さく、行われる作業が少ないことを意味します。
悲観的ロック、多くの場合重量級のロック
楽観的ロック、軽量級のロックが多い
が絶対的ではない
では、より多くの作業を行い、より少ない作業を行うとはどういう意味でしょうか?私たちは一般的に、ロックは相互に排他的でなければならず、相互
排除には力の源が必要であると考えています。
)
Java で実装されているロックは、主に JVM によって提供される同期および ReentrantLock メカニズムです.
JVM がロックメカニズムを実装できる理由は、オペレーティングシステムがミューテックスを提供するためです.
オペレーティングシステムがロックできる理由は、CPU が提供するためです.アトミック操作を保証できるロックのためのいくつかの指示.
重いロックは主にオペレーティングシステムが提供するロックに依存しています. オペレーティングシステムが提供するロックを使用すると, 簡単にブロックして軽量ロックを待つことができます. ロックの使用を避けるようにしてください
.つまり、ユーザー モードとカーネル モードの間の切り替えを回避し、ハング待機 (ブロッキング待機) を回避しようとします。
Synchronized は軽量ロックと重量ロックの両方である適応ロックであり、
ロックの競合状況に応じて決定されます.
低競合は軽量ロックであり、高競合は重量ロックです.
4. スピンロック VS 保留待ちロック
スピン ロックと保留中のロックがより詳細に表示されます。これは、分析の最内層に相当します。
スピンロック: ロックの競合が見つかった場合、待機を中断せず、ロックを取得できるかどうかをすぐに再試行します (スーパーなめ犬)
。
ロックが解除されていない場合は、すぐに取得できます
ロックが解除されていない場合は、多くの CPU を消費します
スピンロックは軽くて効率的です
ロック待ちサスペンド:ロックの競合が発見された場合、待ち合わせを
サスペンドする ロックが解放されると、すぐにロックを取得することはできない
ロックが他のスレッドによって占有されている場合、CPUリソースは放棄されます ロック
のサスペンドと待ち合わせはより重いですそして効率が悪い
スピンロックは、軽量ロックの特定の実装です
ハンギングおよび待機ロックは、重量ロックの特定の実装です
スピンロックは軽量ロックと楽観的ロックです
ぶら下げ待機ロックは重量ロックと悲観的ロックです
Synchronized を軽量ロックとして使用する場合、内部はスピン ロックであり、
Synchroned を重量ロックとして使用する場合、内部はペンディング ロックです。
5. フェアロック VS アンフェアロック
フェアとはどのような場合でしょうか?
「先着順」のルールに則っていればフェアです。
先着の方は前列、遅刻の方は後列となります。
栗を取ります:
オペレーティング システムでは, デフォルトのロック競合ルールは不公平です, 先着順の考慮なし.
公正なロックを使用したい場合, 制御と実装のために追加のデータ構造を使用する必要があります.
したがって、同期は不公平なロック
6. 再入可能ロック vs 非再入可能ロック
7. よくある面接の質問
- 楽観的ロックと悲観的ロックをどのように理解し、どのように実装しますか?
悲観的ロックは、複数のスレッドが同じ共有変数にアクセスする可能性が高く、共有変数への各アクセスの前に実際にロックすると考えています. 楽観的ロックは、複数のスレッドが同じ共有変数にアクセスする可能性は高くないと考えています
.実際にはロックしますが、直接データにアクセスしようとします. アクセス中に、現在のデータにアクセス競合があるかどうかを識別します.
悲観的ロックの実装は、最初にロックすることです (たとえば、オペレーティング システムによって提供されるミューテックスの助けを借りて) , そしてロックを取得した後にデータを操作します. ロックを取得できない場合は待ちます.
楽観的ロックの実装はバージョン番号を導入することができます. バージョン番号を使用して、現在のデータアクセスが競合しているかどうかを識別します. (上記を参照)実装の詳細については図を参照してください)。
- 読み書きロックを導入しますか?
読み書きロックは、読み取り操作と書き込み操作を別々にロックすることです.
読み取りロックと読み取りロックは相互に排他的ではありません. 書き込みロック
と書き込みロックは相互に排他的です.
書き込みロックと読み取りロックは相互に排他的です. .
読み取り/書き込みロックが最も多く、主に「読み取り頻度が高く、書き込み頻度が低い」シナリオで使用されます。
- スピン ロックとは何ですか? スピン ロック戦略を使用する理由と欠点は何ですか?
ロックの取得に失敗した場合は、すぐに再度ロックの取得を試み、ロックが取得されるまで無限ループを繰り返します. 1回目のロック取得に失敗すると、非常に短い時間で2回目の試行が行われます.他のスレッドの場合は、最初にロックを取得できます.
ハングしてロックを待機するのと比較して、
利点: CPU リソースが放棄されない, ロックが解放されると, 最初にロックを取得できる.より効率的. ロック保持時間が比較的短いシナリオで非常に役立ちます. デメリット
: ロックが長時間保持されると、CPU リソースが浪費されます。
- 同期は再入可能ロックですか?
これは再入可能ロックです.
再入可能ロックとは, 2 つの連続したロックがデッドロックを引き起こさないことを意味します.
これを達成する方法は, ロック内のロックが保持するスレッド ID と (ロックの数を記録する) カウンターを記録することです.現在ロックされているスレッドがロックを保持しているスレッドであることが判明した場合、カウントは直接インクリメントされます。
以上でこの記事は終わりです
参考になったら3回押してください
子犬がお酒をごちそうしてくれます