この記事では、同期を使用する 4 つの方法を紹介します。必要な方は参考にしてください。
1. メソッドの変更
synchronized メソッドの変更は非常に簡単です。つまり、メソッドの前に synchronized を追加します。例:
public synchronized void method() { // todo }
はできません。インターフェイス メソッドを定義するときに使用します。 synchronized キーワードを使用します。
コンストラクターは synchronized キーワードを使用できませんが、同期に synchronized コード ブロックを使用できます。
synchronized キーワードは継承できません。同期したい場合は、キーワードを明示的に追加する必要があります。
synchronized キーワードによって変更されたメソッドは、オーバーライドされた場合、デフォルトでは同期されません。同期したい場合は、キーワードを明示的に追加するか、スーパー親クラスのメソッドが同期に相当します。
2. コード ブロックを変更します。
public void method() { synchronized(this) synchronized(XX.class) }
synchronized(this) は、現在複数のオブジェクトがある場合、これのコピーが複数存在します。同じオブジェクトのみをロックできます。
synchronized(XX.class) このロックは、このタイプのクラスである限り便利です。
2 つの同時スレッドが同じオブジェクト オブジェクト内の synchronized(this) 同期コード ブロックにアクセスする場合、1 つのスレッドが一度に実行できるスレッドは 1 つだけです。別のスレッドは、このコード ブロックを実行する前に、現在のスレッドがこのコード ブロックの実行を完了するまで待つ必要があります。スレッドがオブジェクトの synchronized (this) 同期コード ブロックにアクセスするとき、別のスレッドは引き続きオブジェクト内の非 synchronized (this) 同期コード ブロックにアクセスできます。特に重要なのは、スレッドがオブジェクトの synchronized(this) 同期コード ブロックにアクセスすると、オブジェクト内の他のすべての synchronized(this) 同期コード ブロックへの他のスレッドのアクセスがブロックされることです。
3 番目の例は、他の同期されたコード ブロックにも当てはまります。つまり、スレッドがオブジェクトの synchronized (this) 同期コード ブロックにアクセスすると、このオブジェクトのオブジェクト ロックを取得します。その結果、オブジェクト オブジェクトのすべての同期されたコード部分への他のスレッドのアクセスが一時的にブロックされます。
上記のルールは他のオブジェクト ロックにも当てはまります。
3. 静的メソッドを変更する
静的メソッドはオブジェクトではなくクラスに属することがわかっています。同様に、synchronized によって変更された静的メソッドは、このクラスのすべてのオブジェクトをロックします。これを使用すると、すべてのクラスがロック効果を持ちます。
public synchronized static void method() { // todo }
4 クラスの変更#その動作。スコープは同期後の括弧で囲まれた部分で、影響を受けるオブジェクトはこのクラスのオブジェクトであればどれだけオブジェクトがあっても動作します。次のコード
class ClassName { public void method() { synchronized(ClassName.class) { // todo } } }
B. 各オブジェクトに関連付けられたロックは 1 つだけです。このロックを取得した人は、そのオブジェクトが制御するコードを実行できます。
C. 同期を実現するには多くのシステム オーバーヘッドが必要であり、デッドロックが発生する可能性もあるため、不必要な同期制御は避けるようにしてください。
D. 同期キーワードはオブジェクトをロックします。
以上がsynchronized で使用される 4 つの方法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。