スレッドの実行は、インスタンスのメソッドが同期されていればインスタンスごとに1つのスレッドの実行になりますが、同じクラスのインスタンスが複数ある場合、提供するだけのクラスレベルでの同期が必要になる問題となります。オブジェクト レベルで同期するよりも、クラスのすべてのインスタンスに対して 1 つのロックを使用します。これは Java では静的同期と呼ばれます。これは 2 つの方法で実行できます。1 つは静的同期メソッドを使用する方法、もう 1 つは同期ブロックを使用する方法です。静的メソッド内のコード。
無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
構文は次のとおりです:
synchronized static return_type class_name{}
ここで、戻り値の型はクラスから返される値の型、class_name はクラスの名前です。
クラスの各インスタンスは、Java のクラスのオブジェクトに対してロックを持っています。静的メソッドが同期されると、ロックはクラスのオブジェクトではなくクラス自体にかかります。 obj1 と obj2 というクラスの 2 つのオブジェクトがあり、スレッド t1 と t2 がオブジェクト obj1 上で動作しているとします。同様に、スレッド t3 と t4 はオブジェクト obj2 上で動作しています。コード ブロックまたはメソッドが同期されると、スレッド t1 と t2 の両方が単一のロックを持つ同じオブジェクト obj1 を参照するため、スレッド t1 と t2 の間に干渉が生じることはありません。同様に、スレッド t3 と t4 の両方が単一のロックを持つ同じオブジェクト obj2 を参照しているため、スレッド t3 と t4 の間に干渉は存在しません。
しかし、スレッド t1 と t3 の両方が異なるロックを持つ異なるオブジェクトを取得しているため、スレッド t1 と t3 の間に干渉が存在する可能性があります。同様に、スレッド t2 と t4 の両方が異なるロックで異なるオブジェクトを取得しているため、スレッド t2 と t4 の間に干渉が存在する可能性があります。どのスレッド間にも干渉が生じることは望ましくありません。この問題は、Java の静的同期を使用することで解決できます。クラスオブジェクトは、クラスのロードが初めて行われたときに Java 仮想マシンによって作成されます。クラスの最初のロードが行われた後は、同じクラスが再度ロードされることはありません。クラスのインスタンスは、Java 仮想マシンによってロードされるクラスごとに作成されます。クラスのこれらのインスタンスはオブジェクトと呼ばれ、オブジェクトの同期は Java の静的同期を使用して実行できます。
以下は例です:
Java での静的同期をデモするプログラム:
コード:
//a class called check is defined class check { // a method called Line is define and only one thread will be able to access this method at once because it is synchronized synchronized public void Line() { //a for loop is defined to loop from values 0 to 3 for (int r = 1; r <5; r++) { System.out.println(r); try { Thread.sleep(390); } catch (Exception ex) { System.out.println(ex); } } } } //a class called Trap is defend which extends a thread of the class class Trap extends Thread { //a variable of the class check is defined check line1; //a constructor of the class trap is defined with check class variable Trap(check line1) { this.line1 = line1; } //the standard run method is overridden public void run() { line1.Line(); } } //a class called program is defined public class program { //main method is called public static void main(String[] args) { //an instance of the class check is defined check object = new check(); // two threads of the class trap is created and they share the same object Trap tra1 = new Trap(object); Trap tra2 = new Trap(object); //Beginning the execution of two threads tra1.start(); tra2.start(); } }
出力:
説明: 上記のプログラムでは、check というクラスが定義されています。次に、Line というメソッドが定義されます。このメソッドは同期されているため、一度に 1 つのスレッドだけがこのメソッドにアクセスできます。次に、値 0 から 3 までループする for ループが定義されます。次に、クラスのスレッドを拡張する Trap というクラスが Defense されます。次に、クラスチェックの変数を定義します。クラストラップのコンストラクタは、チェッククラス変数をパラメータとして定義されます。その後、標準の run メソッドがオーバーライドされます。次に、program というクラスを定義します。次に、main メソッドが呼び出されます。次に、クラス チェックのインスタンスが定義されます。次に、クラス トラップの 2 つのスレッド tra1 と tra2 が作成され、同じオブジェクトを共有します。次に、2 つのスレッド tra1 と tra2 の実行が、一方のスレッドの実行が他方のスレッドの実行を中断しないように、または一方のスレッドの実行が他方のスレッドの実行をロックしないように開始されます。プログラムの出力は上記のスナップショットに示されているとおりです。
いくつかの利点があります。それらは次のとおりです:
このチュートリアルでは、Java での静的同期の定義、Java での静的同期を宣言する構文、例とその出力、および Java での静的同期の利点を通じて Java での静的同期の仕組みを理解します。
以上がJava での静的同期の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。