Java では、Synchronized ブロックは、関数またはメソッドの特定のリソースで同期を実行するのに役立ちます。コード (LOC) が 100 行あり、同期を 10 行のみ行う必要がある場合は、同期ブロックを使用できます。 Synchronized はキーワード、メソッド、ブロックとして使用できます。このチュートリアルでは、同期ブロックについて詳しく説明します。
無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
構文:
同期ブロックの構文は次のとおりです。
Synchronized( lo) { //statements that have to be synchronized }
ここで、lo はロック オブジェクトです
すでに説明したように、Synchronized ブロックは、関数またはメソッドの特定のリソースで同期を実行するのに役立ちます。スレッドが同期ブロック内で同期されている行を実行する必要がある場合、上記の構文で説明したロック オブジェクト lo のモニターでロックを取得することが必須です。一度に 1 つのスレッドのみがロック オブジェクトのモニターを取得できます。各スレッドは、現在ロックを保持しているスレッドが実行を完了して解放するまで待機する必要があります。
同様に、synchronized キーワードは、一度に 1 つのスレッドだけが同期ブロック内のコード行を実行することを保証します。これにより、複数のスレッドがブロック内で共有されているデータを破損するのを防ぎます。
メソッドが 500 の LOC (コード行) で構成されているが、コードのクリティカル セクション (CS) を保持するコードは 20 行しか存在しないとします。つまり、これらの 20 行によってオブジェクトの状態が変更または変更される可能性があります。したがって、これらの 20 行のコード関数に対して同期を実行して、オブジェクトの状態の変更を回避し、他のスレッドが特定のメソッド内の他の 480 行を中断することなく実行できるようにすることができます。
次に、Java の同期ブロックに関するサンプル プログラムをいくつか見てみましょう。
同期ブロックを実装する Java プログラム
コード:
class Testsmple{ void printTestsmple(int n) { //start of synchronized block synchronized(this) { System.out.println("The output of synchronized block is: "); for( int i=1 ; i<=4 ; i++ ) { System.out.println(n*i); //exception handling try { Thread.sleep(500); } catch(Exception exc) { System.out.println(exc) ; } } } } //end } class T1 extends Thread { Testsmple t; T1(Testsmple t) { this.t=t; } public void run() { t.printTestsmple(10); } } class T2 extends Thread { Testsmple t; T2(Testsmple t) { this.t=t; } public void run() { t.printTestsmple(200); } } public class SyncBlockExample { public static void main(String args[]) { // create only one object Testsmple ob = new Testsmple(); //objects of threads T1 t1=new T1(ob); T2 t2=new T2(ob); //start the threads t1 and t2 t1.start(); t2.start(); } }
出力:
このプログラムでは、2 つのスレッド t1 と t2 が使用されており、それぞれに同期メソッドを呼び出す printTestsmple メソッドがあります。 printTestsmple のスレッド 1 の入力は 10、スレッド 2 の入力は 200 です。結果では、最初のスレッドの同期ブロックの出力が 10、20、30、40 であることがわかります。スレッド 2 の同期ブロックの結果は 200、400、600、800 です。さらに、各スレッドの結果の間に「同期ブロックの出力は次のとおりです。」という行が出力されます。
匿名クラスを使用して同期ブロックを実装する Java プログラム。
コード:
class Testsmple{ void printTestsmple(int n) { //start of synchronized block synchronized(this) { System.out.println("The output of synchronized block is: "); for( int i=1 ; i<=4 ; i++ ) { System.out.println(n*i); //exception handling try { Thread.sleep(500); } catch(Exception exc) { System.out.println(exc) ; } } } } //end } public class SyncBlockExample { //main method public static void main(String args[]) { //create only one object final Testsmple obj = new Testsmple() ; //create thread th1 Thread th1=new Thread() { public void run() { obj.printTestsmple(10) ; } } ; //create thread th2 Thread th2=new Thread() { public void run() { obj.printTestsmple(200); } } ; th1.start() ; th2.start() ; }}
出力:
このプログラムでも、2 つのスレッド t1 と t2 が使用されており、それぞれに同期メソッドを呼び出すメソッド printTestsmple があります。 printTestsmple のスレッド 1 の入力は 10、スレッド 2 の入力は 200 です。結果では、最初のスレッドの同期ブロックの出力が 10、20、30、40 であることがわかります。スレッド 2 の同期ブロックの結果は 200、400、600、800 です。さらに、各スレッドの結果の間に「同期ブロックの出力は次のとおりです。」という行が出力されます。唯一の違いは、このプログラムに匿名クラスが存在することです。
同期ブロックを実装する Java プログラム。
import java.util.*; class ABC { String nm = ""; public int cnt = 0; public void samplename(String stringexample, List<String>li) { // In order to change the name at a time, only 1 thread is permitted synchronized(this) { nm = stringexample; cnt++; } li.add(stringexample); } } public class SyncBlockExample { //main method public static void main (String[] args) { //create an object for the class ABC ABC obj = new ABC(); //create a list List<String>li = new ArrayList<String>(); //call the method using the object created obj.samplename("Anna Sam", li); System.out.println(obj.nm); } }
出力:
このプログラムでは、メソッドsamplename内の同期メソッドを使用してクラスABCが作成されます。文字列「Anna Sam」は、samplename メソッドを呼び出すための入力として渡されます。コードを実行すると、文字列「Anna Sam」が出力されます。
利点の一部を以下に示します:
以上がJavaの同期ブロックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。