Java での静的同期

WBOY
リリース: 2024-08-30 15:59:04
オリジナル
818 人が閲覧しました

スレッドの実行は、インスタンスのメソッドが同期されていればインスタンスごとに1つのスレッドの実行になりますが、同じクラスのインスタンスが複数ある場合、提供するだけのクラスレベルでの同期が必要になる問題となります。オブジェクト レベルで同期するよりも、クラスのすべてのインスタンスに対して 1 つのロックを使用します。これは Java では静的同期と呼ばれます。これは 2 つの方法で実行できます。1 つは静的同期メソッドを使用する方法、もう 1 つは同期ブロックを使用する方法です。静的メソッド内のコード。

無料ソフトウェア開発コースを始めましょう

Web 開発、プログラミング言語、ソフトウェア テスト、その他

構文

構文は次のとおりです:

synchronized static return_type class_name{}
ログイン後にコピー

ここで、戻り値の型はクラスから返される値の型、class_name はクラスの名前です。

Java では静的同期はどのように機能しますか?

クラスの各インスタンスは、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 で静的同期を実装する例

以下は例です:

例 #1

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();
}
}
ログイン後にコピー

出力:

Java での静的同期

説明: 上記のプログラムでは、check というクラスが定義されています。次に、Line というメソッドが定義されます。このメソッドは同期されているため、一度に 1 つのスレッドだけがこのメソッドにアクセスできます。次に、値 0 から 3 までループする for ループが定義されます。次に、クラスのスレッドを拡張する Trap というクラスが Defense されます。次に、クラスチェックの変数を定義します。クラストラップのコンストラクタは、チェッククラス変数をパラメータとして定義されます。その後、標準の run メソッドがオーバーライドされます。次に、program というクラスを定義します。次に、main メソッドが呼び出されます。次に、クラス チェックのインスタンスが定義されます。次に、クラス トラップの 2 つのスレッド tra1 と tra2 が作成され、同じオブジェクトを共有します。次に、2 つのスレッド tra1 と tra2 の実行が、一方のスレッドの実行が他方のスレッドの実行を中断しないように、または一方のスレッドの実行が他方のスレッドの実行をロックしないように開始されます。プログラムの出力は上記のスナップショットに示されているとおりです。

Java における静的同期の利点

いくつかの利点があります。それらは次のとおりです:

  • データの不整合の問題は、Java の静的同期を使用して解決できます。
  • Java で静的同期を使用すると、特定の時点で 1 つのスレッドのみがオブジェクトにアクセスできます。 1 つのスレッドのみがアクセスするオブジェクトは、キーワード synchronized を使用して宣言する必要があります。
  • さまざまなスレッドとさまざまなプロセスの同時実行性は、Java の静的同期を使用して管理できます。つまり、2 つ以上のスレッド、または 1 つのスレッドが他のスレッドの実行をロックしたり中断したりしないようにしながら、2 つ以上のプロセスを同時に実行できます。

結論

このチュートリアルでは、Java での静的同期の定義、Java での静的同期を宣言する構文、例とその出力、および Java での静的同期の利点を通じて Java での静的同期の仕組みを理解します。

以上がJava での静的同期の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート