ロックは、Java 並行プログラミングにおける最も重要な同期メカニズムです。ロックは、java.util.concurrent パッケージの Synchronized キーワードおよび関連クラスを通じて JAVA に実装されます。
Java におけるロックの概念
スピン ロック: スレッドがロックを取得するときに、そのロックが別のスレッドによって取得されている場合、そのスレッドはループ内で待機し、ロックが正常に取得できるかどうかを継続的に判定し、ロックが取得されるまでループは終了しません。
楽観的ロック: 競合がないと仮定し、データを変更する際に、以前に取得したデータと不整合があった場合、最新のデータを読み込み、変更後に再度変更を試みます。 ##悲観的ロック: 同時実行性の競合が発生すると想定し、データに対するすべての関連操作を同期し、データの読み取り時にロックを開始します
排他的ロック (書き込み): リソースに書き込みロックを追加します。ロックはリソースを変更でき、他のスレッドはそれ以上のロックを追加できません (単一書き込み)
共有ロック (読み取り): リソースに読み取りロックを追加した後は、読み取りのみ可能ですが変更はできません。追加できるのは読み取りロックのみで、書き込みロックは追加できません (複数の読み取り)
リエントラント ロック: スレッドはロックを取得した後、同じロックと同期して自由にコードに入ることができます
非リエントラントlock: スレッドはロックを取得した後、同じコードを自由に入力できません。 ロックを同期するためのコードです。
#Fair lock: ロックの競合順序は先着順です 不公平なロック: ロックの競合の順序は先着順ではありませんJava におけるいくつかの重要なロック実装メソッド:
synchronized、ReentrantLock、ReentrantReadWriteLock同期キーワード:
synchronizedロック範囲:
オブジェクト ロック、クラス ロック、分散ロック同期機能:
リエントラント、排他的、悲観的ロックロックの最適化:
ロックの削除は、コンパイラ レベルで発生するロックの最適化方法です。コンパイラが実行中です。一部のコードの同期が必要ですが、共有データに対するロックの競合がないことが検出されました。 Eliminate (ロックの削除をオンにするためのパラメータ: -xx: DoEscapeAnalysis -XX: EliminateLocks) Lock粗密化: 場合によっては、欠点を減らすために、多くのロック リクエストを 1 つのリクエストにマージする必要があります。一定期間内に大量のロック リクエスト、同期、解放が原因でパフォーマンスが低下します。注: 同期されたロック リクエストは、キーワードは同期を実現するだけでなく、JMM では synchronized が可視性を確保する必要がある (キャッシュできない) と規定しています synchronized 使用法のコード例:public class Counter { private static int i = 0; // 等价于 synchronized(this) public synchronized void update() { i++; } public void updateBlock() { synchronized (this) { i++; } } // 等价于 synchronized (Counter.class) public static synchronized void staticUpdate() { i++; } public static void staticUpdateBlock() { synchronized (Counter.class) { i++; } } }
以上がJava ロックとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。