Javaマルチスレッド - 同期ブロック
Java同期ブロックは、同期されるメソッドまたはコードブロックをマークするために使用されます。 Java同期ブロックは、競争を回避するために使用されます。この記事では、次のコンテンツを紹介します。
Java同期キーワード(同期)
Javaの同期ブロックは、同期されたマークされています。同期ブロックは、Javaのオブジェクトで同期されます。オブジェクトで同期されたすべての同期ブロックは、1つのスレッドでのみ入力し、操作を同時に実行できます。同期ブロックに入るのを待っている他のすべてのスレッドは、同期ブロックのスレッドが出口を実行するまでブロックされます。
4つの異なる同期ブロックがあります。
上記の同期ブロックはすべて、異なるオブジェクトで同期されています。実際に必要な同期ブロックは、特定の状況によって異なります。
インスタンスメソッド同期
同期した例の方法は次のとおりです。
public synchronized void add(int value){this.count += value; }
静的メソッド同期
静的メソッド同期は、インスタンスメソッド同期方法と同じであり、同期されたキーワードも使用されます。 Java静的メソッド同期は次のとおりです。
public static同期void add(int value){count += value; }同様に、ここの同期キーワードは、この方法が同期されていることをJavaに伝えます。
静的メソッドの同期とは、メソッドが配置されているクラスオブジェクトの同期を指します。クラスはJava仮想マシン内の1つのクラスオブジェクトにのみ対応できるため、同じクラスで静的同期メソッドを実行できるスレッドは1つだけです。
さまざまなクラスの静的同期方法の場合、スレッドは待機せずに各クラスで静的同期メソッドを実行できます。クラスの静的同期方法に関係なく、クラスは同時に1つのスレッドでのみ実行できます。
インスタンスメソッドの同期ブロック
メソッド全体を同期する必要がなく、代わりにメソッドの一部を同期する必要がない場合があります。 Javaはメソッドの一部を同期させることができます。
非同期Javaメソッドの同期ブロックの例を以下に示します。
public void add(int value){synchronized(this){this.count += value; }}例Java同期ブロックコンストラクターを使用して、同期したコードをマークします。このコードは、実行時の同期方法と同じです。
Java同期ブロックコンストラクターは、オブジェクトをブラケットに囲むことに注意してください。上記の例では、「This」が使用されます。つまり、ADDメソッドを呼び出すインスタンス自体です。同期コンストラクターのブラケットに囲まれたオブジェクトは、モニターオブジェクトと呼ばれます。上記のコードはモニターオブジェクトの同期を使用し、同期インスタンスメソッドはモニターオブジェクトとして呼び出しメソッド自体のインスタンスを使用します。
一度に同じモニターオブジェクトに同期したJavaメソッドで実行できるスレッドは1つだけです。
次の2つの例は、呼び出すインスタンスオブジェクトを同期するため、同期した実行効果で同等です。
public class myclass {public synchronized void log1(string msg1、string msg2){log.writeln(msg1); log.writeln(msg2); } public void log2(string msg1、string msg2){synchronized(this){log.writeln(msg1); log.writeln(msg2); }}}上記の例では、2つの同期ブロックのいずれかで1つのスレッドのみを一度に実行できます。
2番目の同期ブロックがこのインスタンスオブジェクトで同期されていない場合、2つの方法はスレッドによって同時に実行できます。
静的方法の同期ブロック
上記と同様に、以下は2つの静的な方法の同期の例です。これらのメソッドは、メソッドが属するクラスオブジェクトに同期されます。
public class myclass {public static同期Void log1(string msg1、string msg2){log.writeln(msg1); log.writeln(msg2); } public static void log2(string msg1、string msg2){synchronized(myclass.class){log.writeln(msg1); log.writeln(msg2); }}}これらの2つの方法では、スレッドによる同時にアクセスを許可しません。
2番目の同期ブロックがmyClass.classオブジェクトで同期されていない場合。次に、これらの2つの方法に同時にスレッドでアクセスできます。
Java同期インスタンス
次の例では、2つのスレッドが開始され、両方ともカウンタークラスの同じインスタンスのADDメソッドを呼び出します。同期は、メソッドが属するインスタンスにあるため、同時にメソッドにアクセスできるスレッドのみが1つのスレッドのみです。
パブリッククラスカウンター{long count = 0; public同期void add(long value){this.count += value; }} public class counterthread extends thread {protected counter counter = null; public counterthread(カウンターカウンター){this.count = counter; } public void run(){for(int i = 0; i <10; i ++){counter.add(i); }}} public class example {public static void main(string [] args){counter counter = new counter();スレッドスレッド= new CounterThread(counter); thread threadb = new CounterThread(counter); threada.start(); threadb.start(); }}2つのスレッドが作成されました。それらのコンストラクターは、同じカウンターインスタンスを指します。 ADDメソッドはインスタンスメソッドであり、同期されたキーワードでマークされているため、Counter.ADDメソッドはインスタンスで同期されます。したがって、一度にメソッドを呼び出すことができるスレッドは1つだけです。別のスレッドは、メソッドの実行を継続する前に、最初のスレッドがadd()メソッドを終了するまで待つ必要があります。
2つのスレッドが2つの異なるカウンターインスタンスを参照する場合、同時にADD()メソッドを呼び出すことができます。これらのメソッドは異なるオブジェクトを呼び出すため、これらのメソッドは異なるオブジェクトで同期されます。これらのメソッド呼び出しはブロックされません。次の例に示すように:
パブリッククラスの例{public static void main(string [] args){counter countera = new counter(); counter counterb = new counter();スレッドスレッド= new CounterThread(Countera); thread threadb = new CounterThread(counterb); threada.start(); threadb.start(); }}これらの2つのスレッド、ThreadaとThreadBは、同じカウンターインスタンスを参照しなくなったことに注意してください。 CounteraとCounterBの追加方法は、それらが属するオブジェクトに同期されます。 CounteraのADDメソッドを呼び出しても、CounterBのADDメソッドへの呼び出しがブロックされません。
上記は、Javaマルチスレッド同期ブロックの知識の説明です。今後も関連情報を追加し続けます。このサイトへのご支援ありがとうございます!