Javaでsynchronizedキーワードを使用する方法を簡単に記録します。
説明の前に、Java のクラスの各オブジェクト インスタンスには、関連付けられたロック (ロック) が 1 つだけあること、つまり、synchronized のみが機能することを明確にする必要があります。 Java クラスのオブジェクト インスタンスに影響を与えます。
同期変更機能
次のようにコードをコピーします。
public synchronized aMethod(){
}
これは最も一般的に使用されるシナリオですが、この同期メソッドの目的は何ですか? 便宜上、このメソッドを aMethod メソッドと呼びます。
1. 同期ロックとは、この同期メソッドを呼び出すオブジェクト インスタンスです。たとえば、同じインスタンス P1 が異なるスレッドで aMethod を呼び出すと、同期が発生します。
異なるオブジェクトインスタンスの同期されたメソッドは互いに干渉しないため、このオブジェクトが属するクラスの別のオブジェクトP2は、このaMethodを任意に呼び出すことができることに留意されたい。つまり、他のスレッドは同じクラスの別のオブジェクト インスタンスの aMethod メソッドに同時にアクセスできます。
3. オブジェクトに aMethod、bMethod、cMethod などの複数の同期メソッドがある場合、1 つのスレッドが同期メソッドの 1 つにアクセスする限り、他のスレッドはオブジェクト内の同期メソッドに同時にアクセスできなくなります。
上記のコードは実際には次のコードと等価です。
次のようにコードをコピーします。
public void aMethod() {
同期された (これ) {
}
}
ここでこれは、P1 などのインスタンス オブジェクトの参照を指します。同期メソッドの本質は、オブジェクト参照に synchronized を適用することであることがわかります。 P1 オブジェクト ロックを取得したスレッドのみが P1 の同期メソッドを呼び出すことができます。P2 に関しては、プログラムは同期メカニズムの制御を取り除くこともできます。データの混乱を引き起こす可能性があります。これから、以下の同期ブロックを導き出します。
同期された変更されたコード ブロック
次のようにコードをコピーします。
public void dMethod(SomeObject so) {
同期された(so) {
}
}
ここで synchronized によって取得されたロックは so オブジェクトのロックであるため、ロックを取得した人は誰でも自分が制御するコードを実行できます。ロックとしてクリアなオブジェクトがある場合は、次のようにプログラムを書くことができますが、ロックとしてクリアなオブジェクトがなく、コードの一部を同期したいだけの場合は、特別なインスタンス変数を作成できます (オブジェクト) をロックとして機能させます。
次のようにコードをコピーします。
class Foo は Runnable {を実装します
プライベート バイト[] ロック = 新しいバイト[0];
パブリック void メソッド() {
同期(ロック) {
}
}
}
長さ 0 のバイト配列オブジェクトは、他のオブジェクトよりも作成コスト効率が高くなります。
同期された変更された静的メソッド
前に述べたように、synchronized キーワードは、異なるスレッドの P1 インスタンスに対してのみ有効です。それでは、どのようにして同時に P1 と P2 のインスタンスに対して有効になるのでしょうか。その答えは、静的メソッドを変更するために synchronized を使用することです。クラスは、そのクラスのインスタンスに依存しないため、クラスの静的メソッドを変更するために必要なのは synchronized キーワードだけであり、異なるインスタンス間の同期を実現できます。