Javaの同期ブロック

王林
リリース: 2024-08-30 15:58:55
オリジナル
911 人が閲覧しました

Java では、Synchronized ブロックは、関数またはメソッドの特定のリソースで同期を実行するのに役立ちます。コード (LOC) が 100 行あり、同期を 10 行のみ行う必要がある場合は、同期ブロックを使用できます。 Synchronized はキーワード、メソッド、ブロックとして使用できます。このチュートリアルでは、同期ブロックについて詳しく説明します。

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

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

構文:

同期ブロックの構文は次のとおりです。

Synchronized( lo)
{
//statements that have to be synchronized
}
ログイン後にコピー

ここで、lo はロック オブジェクトです

同期ブロックは Java でどのように機能しますか?

すでに説明したように、Synchronized ブロックは、関数またはメソッドの特定のリソースで同期を実行するのに役立ちます。スレッドが同期ブロック内で同期されている行を実行する必要がある場合、上記の構文で説明したロック オブジェクト lo のモニターでロックを取得することが必須です。一度に 1 つのスレッドのみがロック オブジェクトのモニターを取得できます。各スレッドは、現在ロックを保持しているスレッドが実行を完了して解放するまで待機する必要があります。

同様に、synchronized キーワードは、一度に 1 つのスレッドだけが同期ブロック内のコード行を実行することを保証します。これにより、複数のスレッドがブロック内で共有されているデータを破損するのを防ぎます。

メソッドが 500 の LOC (コード行) で構成されているが、コードのクリティカル セクション (CS) を保持するコードは 20 行しか存在しないとします。つまり、これらの 20 行によってオブジェクトの状態が変更または変更される可能性があります。したがって、これらの 20 行のコード関数に対して同期を実行して、オブジェクトの状態の変更を回避し、他のスレッドが特定のメソッド内の他の 480 行を中断することなく実行できるようにすることができます。

Java での同期ブロックの例

次に、Java の同期ブロックに関するサンプル プログラムをいくつか見てみましょう。

例 #1

同期ブロックを実装する 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();
}  }
ログイン後にコピー

出力:

Javaの同期ブロック

このプログラムでは、2 つのスレッド t1 と t2 が使用されており、それぞれに同期メソッドを呼び出す printTestsmple メソッドがあります。 printTestsmple のスレッド 1 の入力は 10、スレッド 2 の入力は 200 です。結果では、最初のスレッドの同期ブロックの出力が 10、20、30、40 であることがわかります。スレッド 2 の同期ブロックの結果は 200、400、600、800 です。さらに、各スレッドの結果の間に「同期ブロックの出力は次のとおりです。」という行が出力されます。

例 #2

匿名クラスを使用して同期ブロックを実装する 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() ;
}}
ログイン後にコピー

出力:

Javaの同期ブロック

このプログラムでも、2 つのスレッド t1 と t2 が使用されており、それぞれに同期メソッドを呼び出すメソッド printTestsmple があります。 printTestsmple のスレッド 1 の入力は 10、スレッド 2 の入力は 200 です。結果では、最初のスレッドの同期ブロックの出力が 10、20、30、40 であることがわかります。スレッド 2 の同期ブロックの結果は 200、400、600、800 です。さらに、各スレッドの結果の間に「同期ブロックの出力は次のとおりです。」という行が出力されます。唯一の違いは、このプログラムに匿名クラスが存在することです。

例 #3

同期ブロックを実装する 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);
}
}
ログイン後にコピー

出力:

Javaの同期ブロック

このプログラムでは、メソッドsamplename内の同期メソッドを使用してクラスABCが作成されます。文字列「Anna Sam」は、samplename メソッドを呼び出すための入力として渡されます。コードを実行すると、文字列「Anna Sam」が出力されます。

メリット

利点の一部を以下に示します:

  • 同期の範囲が制限されている場合、パフォーマンスの向上が可能です。
  • 小さなコード ブロックを同期して、計算コストを削減します。
  • 他のオブジェクトをロックとして柔軟に使用できます。
  • Java はマルチスレッド プログラミング言語であるため、共有リソース上で相互排他を実現することが最善です。

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

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