ロック分類
楽観的ロック|悲観的ロック
悲観的ロックと楽観的ロックは、同時条件下でのリソース割り当て戦略に従って区別されます
楽観的ロック:同じデータに対する同時操作は変更されないと思います。読み込み中はロックされず、書き込み中に現在のデータが変更されているかどうかを判断します。
楽観的ロックの実装:バージョン番号メカニズムとCASメカニズム(CASメカニズムはABA問題を解決する必要があります)。
悲観的ロック:同じデータの同時操作には変更が必要であると考えます。変更がない場合でも、変更と見なされます。つまり、最悪の事態が常に発生します。
悲観的ロックは、データを保持するときに常にリソースまたはデータをロックするため、他のスレッドは、悲観的ロックがリソースを解放するまで、このリソースを要求するときにブロックします。
楽観的ロックは、より多くの読み取りと少ない書き込みに適しており、悲観的ロックは、より多くの書き込みと少ない読み取りに適しています。
フェアロック|フェアロック
公平ロックと不公平ロックは、ロックが取得された順序によって区別されます
公平なロック:マルチスレッドのもとでスレッドがロックを適用する順序でのロックの割り当てを指します。先着順です。
不当なロック:マルチスレッドでロックを取得する順序が、ロックを適用する順序に従っていないことを意味します。後で適用されたスレッドが最初に適用されたスレッドよりも先にロックを取得する可能性があります。
公平ロックはスレッドの要求シーケンスを記録するために追加のリソースを必要とするため、不公平ロックは公平ロックよりもパフォーマンスが優れています
排他ロック|共有ロック
排他ロックと共有ロックは、ロックを保持できるスレッドの数によって区別されます
排他ロック:このロックは、一度に1つのスレッドのみが保持できます。
共有ロック:ロックは複数のスレッドで保持できます。
排他ロックと共有ロックは、排他的または共有を実現するためのさまざまな方法を通じて、AQSを通じて実装されます。
相互排他ロック|読み取り/書き込みロック
相互に排他的なロックと読み書きロックは、実際には排他ロックと共有ロックの特定の用語です。
Javaでのmutexロックの実装はReentrantLockであり、Javaでの読み取り/書き込みロックの本質はReadWriteLockです。
バイアスロック|軽量ロック|重量ロック
これらの3つのロックは、ロックの状態を参照します
Synchronized
バイアスロック:スレッドによってアクセスされた同期コードの一部を指します。その後、スレッドは自動的にロックを取得し、ロックを取得するコストを削減します。
軽量ロック:ロックがバイアスされ、別のスレッドによってアクセスされると、バイアスされたロックは軽量ロックにアップグレードされ、他のスレッドは常識的なスピン形式でロックを取得し、ブロックせず、パフォーマンスを向上させます。 。
ヘビーウェイトロック:ロックがライトウェイトロックの場合、他のスレッドがスピンしているにもかかわらず、シングルスピンが無期限に継続することはありません。自己選択が特定の回数に達すると、ロックが取得されず、ブロックに入ります。ロックは重いロックに拡張されます。重いロックは、他のアプリケーションスレッドをブロックし、パフォーマンスを低下させる可能性があります。
その他:スピンロック|リエントラントロック|セクショナルロック
スピンロック:ロックを取得しようとするスレッドがすぐにブロックされるのではなく、ループでロックを取得しようとするスレッドを指します
スピンロックの利点は、スレッドコンテキストの切り替えの消費を減らすこと
CPU
です。欠点は、サイクルがを消費することです。
再入可能ロック:再帰的ロックとも呼ばれます。つまり、同じスレッドが外部メソッドでロックを取得すると、内部メソッドに入るときに自動的にロックを取得します。ジャワ、Synchronized
およびReentrantLock
リエントラントロックされています。
セグメント化ロック:特定の種類のロックではなく、一種のロック設計です。Java のセグメントロック使用のデザイン。ConcurrentHashMap
Segment