一,synchronized
仮想通話システムを例に挙げます。
並行プログラムを使用して番号を呼び出すと、番号が飛ぶ、番号が重複する、最大値を超えるなどの現象が発生します。
JMM モデルを参照してください ( https://blog.csdn.net/qq_22059611/article/details/95211836)
ワークスペース データは他のスレッドからは見えず、拍手操作はアトミック操作ではないため、この種の問題が発生することがわかります。
この問題を解決するために、ロックの概念が導入され、あるスレッドが共有データを操作すると、他のスレッドはデータを操作できなくなります。
1. 関連概念
なぜロックを使用すると同期が実現できるのでしょうか?
ロック機構には次の 2 つの特徴があります。
相互排他: つまり、同時に 1 つのスレッドだけが特定のオブジェクト ロックを保持できます。この機能により、コード ブロック上で 1 つのスレッドのみが実行されるように、マルチスレッドの調整メカニズムが実現されます (複合操作)。同時に同期する必要があります。相互排他は、操作の原子性ともよく呼ばれます。
可視性: ロックが解放される前に、共有変数に加えられた変更が、その後ロックを取得する別のスレッドから見えることを確認する必要があります (つまり、ロックの取得時に最新の共有変数の値が取得される必要があります)。そうでない場合は、別のスレッド ローカルにキャッシュされたコピーで操作を続行すると、不整合が発生する可能性があります。
2. 同期の使用法
a. 同期方法
(1) 同期された非静的メソッド
パブリック同期型 void メソッド名(){
……
}
(2) 同期静的メソッド
パブリック同期静的 void methodName(){
……
}
b. 同期コードブロック
synchronized(this|object) {}
synchronized(类.class) {}
Private Final Object MUTEX =new Object();
Public void メソッド名(){ Synchronized(MUTEX ){ …… } }
取得したロックによる分類
1. オブジェクトのロックを取得する
synchronized(this|object) {}
非静的メソッドを修飾する
Java では、各オブジェクトはモニター オブジェクトを持ちます。これは実際には Java オブジェクトのロックであり、通常は「組み込みロック」または「オブジェクト ロック」と呼ばれます。1 つのクラスには複数のオブジェクトが存在できるため、各オブジェクトは相互に干渉することなく独自の独立したオブジェクト ロックを持ちます。
2. クラスロックを取得する
synchronized(类.class) {}
静的メソッドを装飾する
Java では、クラスごとに「クラス ロック」と呼ばれるロックがあり、クラス ロックは実際にはオブジェクト ロック、つまりクラスの Class オブジェクト ロックを通じて実装されます。Class オブジェクトはクラスごとに 1 つだけ存在するため、クラス ロックはクラスごとに 1 つだけ存在します。
使用説明書
Java では、すべてのオブジェクトにモニター オブジェクト、monitor があります。
1) 特定のスレッドがこのオブジェクトを所有している場合、最初にモニター カウンタが 0 であるかどうかを確認します。それが 0 で、どのスレッドも所有していない場合は、そのスレッドがこの時点でこのオブジェクトを所有し、このオブジェクトのモニターに 1 を追加します。これは 0 ではありません。これは、スレッドがすでに別のスレッドによって占有されており、このスレッドは待機していることを意味します。スレッドが所有権を解放すると、monitor-1;
2) 同じスレッドは同じオブジェクトを複数回ロックできます (+1、+1、リエントラント)
3. 同期原理の解析
二。volatile