ホームページ Java &#&チュートリアル 同期キーワードの使用

同期キーワードの使用

Sep 06, 2019 pm 04:02 PM
synchronized

synchronized キーワードは、Java 同時プログラミングで一般的に使用される同期ロックです。メソッドまたはコード ブロックをロックするために使用されます。コード ブロックをロックする場合は、synchronized(this){}、synchronized(Object){}、synchronized を使用できます。 (クラス) {}。

同期キーワードの使用

#ロックされたコンテンツが実行されるか、実行中に例外がスローされると、ロックは自動的に解放されます。

手動でロックを解放したい場合は、ロックされたオブジェクトの wait() メソッドを呼び出してロックを解放して待機状態にし、他のスレッドに切り替えて実行する必要があります。 () メソッドは、他のスレッドの wait() メソッドと呼び出されたオブジェクトを起動するだけですが、ロックは解放されず、選択順序はコードによって制御されず、仮想マシンによって実装されます。

したがって、オブジェクトの wait()、notify()、および NoticeAll() メソッドは、スレッド間のスケジューリングを完了するために synchronized キーワードとともにのみ使用できます。

ロックされたメソッドは、次のように synchronized(this){コード ブロックとしてのメソッドのすべてのコード} と同等です。

public synchronized void test() {
...
}
ログイン後にコピー

上記と同等たとえば、ロックされている例は、このクラスのオブジェクトです。静的メソッドがロックされている場合、その静的メソッドはオブジェクトではなくクラスに属していることがわかります。したがって、synchronized によって変更された静的メソッドは、このクラスのすべてのオブジェクトをロックします。 、このクラスに属している限り、2 つの Instance オブジェクトであってもロックされます。

public void test() {
synchronized (this) {
...
}
}
ログイン後にコピー

public synchronized static void test() {
	...
}
ログイン後にコピー

と同等 コード ブロックをロックするときの参照オブジェクトがロック メソッドであっても、コード ブロックであっても、1 つの原則を覚えていれば明らかです。つまり、参照オブジェクトが同じである場合にのみ同期ロックが機能し、それ以外の場合、ロックは相互に排他的ではなく、同時に実行できます。

synchronized(this) は、現在のクラスのオブジェクト インスタンスが同じである場合にロックが有効になることを示し、synchronized(Object) は、Object オブジェクトが同じである場合にロックが有効になることを示し、synchronized(class ) は、すべてが同じクラスである場合にロックが有効になることを示します。

簡単な例を示します:

public static void test() {
synchronized (所在类.class) {
...
}	
}
ログイン後にコピー

上記のコードでは、参照オブジェクト str は "1" です。Java では、文字列文字列が this.str="1" を渡すと、代入は次のようになります。 str=String.valueOf("1") と同等。文字列 "1" が以前に初期化されている場合は、前のものが直接取得されるため、同じオブジェクトになります。上で紹介した原理によれば、ロックがかかるため、結果は 3 秒後に 1 が出力され、さらに 3 秒後に 1 が出力されます。

スレッド 2 が

public class TestController {
 
    public class Task implements Runnable{
		private String str;
		
		Task(String str){
			this.str=str;
		}
		
		@Override
		public void run() {
			synchronized (str) {
				try {
					Thread.sleep(3000l);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(str);
			}
		}
		
	}
	
	public static void main(String[] args) throws InterruptedException {
		TestController testController = new TestController();
		Thread thread1 = new Thread(testController.new Task("1"));
		Thread thread2 = new Thread(testController.new Task("1"));
		thread1.start();
		thread2.start();
	}
}
ログイン後にコピー

に変更された場合、参照オブジェクトの一方は「1」、もう一方は「2」となり、同じオブジェクトではないため、相互にロックされません。排他的で動作しないため、結果は 3 秒後に 1 と 2 がほぼ同時に出力されます。

上記はすべて、同じメソッドを同時に呼び出す複数のスレッドです。異なるメソッドが呼び出された場合はどうなるでしょうか?

Thread thread2 = new Thread(testController.new Task("2"));
ログイン後にコピー

上記のコードの出力結果は次のとおりです:

public class Test{
	
	public synchronized void m1(){
		System.out.println("m1 running...");
		try {
			Thread.sleep(3000l);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("m1 end");
	}
	
	public synchronized void m2(){
		System.out.println("m2 running...");
		System.out.println("m2 end");
	}
	
	public static void main(String[] args) {
		Test test = new Test();
		new Thread(new Runnable() {
			@Override
			public void run() {
				test.m1();
			}
		}).start();
		new Thread(new Runnable() {
			@Override
			public void run() {
				test.m2();
			}
		}).start();
	}
	
}
ログイン後にコピー

前述のように、同期された変更は synchronized(this){コード ブロックとしてのメソッドのすべてのコード} と同等です。これは、オブジェクトであることを表します。つまり、最初のスレッドがテスト オブジェクトのロックを取得します。オブジェクトはすべて同じテストであるため、2 番目のスレッドはロックを取得できず、ブロックされます。

上記の例を次のように変更します。

m1 running...
//过3秒
m1 end
m2 running...
m2 end
ログイン後にコピー

最初のスレッドが m1() を呼び出すと、オブジェクト str のロックが取得され、2 番目のスレッドも m2 を呼び出すときにそれが必要になります。 () オブジェクト str のロックを取得します。これらは同じ Test オブジェクトであるため、2 つの str も同じオブジェクトであるため、2 番目のスレッドはロックを取得できないためブロックされ、出力結果は同じになります。前の例のように。

上記の例を次のように変換すると:

private String str = "1";
	
public void m1(){
	synchronized(str){
		System.out.println("m1 running...");
		try {
			Thread.sleep(3000l);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("m1 end");
	}
}
 
public void m2(){
	synchronized(str){
		System.out.println("m2 running...");
		System.out.println("m2 end");
	}
}
ログイン後にコピー

今回呼び出されるメソッドは 2 つのクラスにありますが、ロックされているため、結果は前の 2 つの例と同じになります。渡されたすべての str オブジェクト。同じオブジェクトのロックは 1 つだけです。最初のスレッドがそれを取得すると、2 番目のスレッドは待機することしかできません。

概要:

A. synchronized キーワードがメソッドに追加されるかオブジェクトに追加されるかに関係なく、そのキーワードが作用するオブジェクトが非静的である場合、ロックは取得されるのはオブジェクトです ; 同期されたオブジェクトが静的メソッドまたはクラスの場合、取得されるロックはそのクラス用であり、そのクラスのすべてのオブジェクトは同じロックを持ちます。

B. 各オブジェクトにはロックが 1 つだけ関連付けられており、このロックを取得した人は、そのロックが制御するコードを実行できます。

C. 同期を実現するには多くのシステム オーバーヘッドが必要であり、デッドロックが発生する可能性もあるため、不必要な同期制御は避けるようにしてください。

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java での Synchronized の原理と使用シナリオ、および Callable インターフェイスの使用法と差異分析 Java での Synchronized の原理と使用シナリオ、および Callable インターフェイスの使用法と差異分析 Apr 21, 2023 am 08:04 AM

1. 基本機能 1. 楽観的ロックで開始し、ロック競合が多発する場合は悲観的ロックに変換する 2. 軽量なロック実装で開始し、長時間ロックを保持するとロックを解除する3. 軽量ロックを実装するときに最もよく使用されるスピン ロック戦略 4. 不公平なロックである 5. リエントラント ロックである 6. 読み取り/書き込みロックではない 2. JVMロック プロセスを同期します。 ロックは、ロックなし、バイアスされたロック、軽量ロック、および重量ロックの状態に分類されます。状況に応じて順次バージョンアップしていきます。偏ったロックは男主人公を鍵、女主人公をスレとするもので、このスレッドだけがこのロックを使用すれば、たとえ結婚証明書を取得しなくても男主人公と女主人公は永遠に幸せに暮らせる(高額回避) -コストオペレーション)しかし、女性のサポート役が登場します

Javaキーワード同期原理とロック状態の分析例 Javaキーワード同期原理とロック状態の分析例 May 11, 2023 pm 03:25 PM

1. Java におけるロックの概念 Spin ロック: スレッドがロックを取得するとき、そのロックが別のスレッドによって取得されている場合、スレッドはループで待機し、ロックが正常に取得できるかどうかを判断し続けます。ロックが取得されると、ロックはループを終了します。楽観的ロック: 競合がないことを前提として、データを変更する際に以前に取得したデータと不整合が見つかった場合、最新のデータを読み込み、変更を再試行します。悲観的ロック: 同時実行性の競合が発生することを想定し、すべてのデータ関連操作を同期し、データが読み取られた時点からロックを開始します。排他的ロック (書き込み): リソースに書き込みロックを追加します。スレッドはリソースを変更できますが、他のスレッドはリソースを再度ロックすることはできません (単一書き込み)。共有ロック (読み取り): リソースに読み取りロックを追加した後、読み取りのみ可能ですが変更はできません。他のスレッドは読み取りロックのみを追加でき、書き込みロック (複数) を追加できません。 S として参照

synchronized を使用して Java で同期メカニズムを実装するにはどうすればよいですか? synchronized を使用して Java で同期メカニズムを実装するにはどうすればよいですか? Apr 22, 2023 pm 02:46 PM

Java 1 での synchronized の使い方のまとめ。関数修飾子として synchronized を使用した場合のサンプルコードは次のようになります: Publicsynchronizedvoidmethod(){//….} これが同期メソッドですが、このときどのオブジェクトが同期ロックされているのでしょうか?彼がロックするのは、この同期されたメソッド オブジェクトを呼び出すことです。言い換えれば、オブジェクト P1 がこの同期メソッドを異なるスレッドで実行すると、同期効果を達成するために相互排他が形成されます。ただし、このオブジェクトが属するクラスが生成する別のオブジェクトP2は、synchronizedキーワードを付加してこのメ​​ソッドを任意に呼び出すことができる。上記のサンプルコードなど。

Java の 3 つの同期方法とその使用方法は何ですか? Java の 3 つの同期方法とその使用方法は何ですか? Apr 27, 2023 am 09:34 AM

1. 同期は最も一般的に使用される同期方法であり、これには主に 3 つの使用方法があることを説明します。 2. 例//一般的なクラス メソッドの同期 synchronizedpublidvoidinvoke(){}//クラスの静的メソッドの同期 synchronizedpublicstaticvoidinvoke(){}//コード ブロックの同期 synchronized(object){}これら 3 つのメソッドの違いは、同期されるオブジェクトが異なることです。通常のクラスはオブジェクト自体を同期し、静的メソッドはクラス自体を同期し、コード ブロックは括弧内のオブジェクトを同期します。 Javaにはどのようなコレクションがありますか?

Java 同期ロックのアップグレードの原理とプロセスは何ですか? Java 同期ロックのアップグレードの原理とプロセスは何ですか? Apr 19, 2023 pm 10:22 PM

ツールの準備 同期の原理について正式に説明する前に、まずスピン ロックについて話しましょう。スピン ロックは同期の最適化に大きな役割を果たすためです。スピン ロックを理解するには、まずアトミック性とは何かを理解する必要があります。いわゆるアトミック性とは、単に各操作が行われないか完了することを意味します。すべてを行うということは、操作中に中断できないことを意味します。たとえば、変数データに 1 を追加するには、次の 3 つのステップがあります: メモリからレジスタにロードする。データの値に 1 を加算します。結果をメモリに書き込みます。原子性とは、スレッドがインクリメント操作を実行しているときに、他のスレッドによって中断できないことを意味し、このスレッドがこれら 3 つのプロセスを完了した場合にのみ実行されます。

Java では、synchronized キーワードを使用するだけでなく、Lock を提供する必要があるのはなぜですか? Java では、synchronized キーワードを使用するだけでなく、Lock を提供する必要があるのはなぜですか? Apr 20, 2023 pm 05:01 PM

概要: synchronized キーワードは、1 つのスレッドのみが同期されたコード ブロックにアクセスできるようにするために Java で提供されています。 synchronized キーワードが提供されているのに、なぜ Lock インターフェースも Java SDK パッケージで提供されるのですか?これは不必要な車輪の再発明でしょうか?今日はこの問題について一緒に話し合います。 Java では synchronized キーワードが提供され、1 つのスレッドのみが同期されたコード ブロックにアクセスできるようにします。 synchronized キーワードが提供されているのに、なぜ Lock インターフェースも Java SDK パッケージで提供されるのですか?これは不必要な車輪の再発明でしょうか?今日は一緒にそれについて話し合いましょう

Java同期とは Java同期とは May 14, 2023 am 08:28 AM

Synchronized とは何ですか? Java 読者は synchronized キーワードに馴染みがありません。これはさまざまなミドルウェア ソース コードや JDK ソース コードで見ることができます。synchronized に詳しくない読者にとっては、synchronized キーワードは複数の言語で使用する必要があることだけを知っています。 -threading.synchronized によりスレッドの安全性を確保できます。これは、ミューテックス ロック (同時に 1 つのスレッドだけが実行でき、他のスレッドは待機します)、または悲観的ロック (同時に 1 つのスレッドだけが実行でき、他のスレッドは待機します) と呼ばれます。JVM 仮想マシンは、開発者は synchronized キーワードを使用するだけで済みます。使用する場合は、ロックのミューテックスとしてオブジェクトを使用する必要があります

Java にはアクセス以外の修飾子がいくつありますか? Java にはアクセス以外の修飾子がいくつありますか? Aug 30, 2023 pm 06:01 PM

Java には、可視性を超えた機能を提供する他の修飾子がいくつか用意されています。これらの修飾子は非アクセス修飾子と呼ばれ、静的として宣言された静的メンバーはクラスのすべてのインスタンスに共通です。静的メンバーは、クラス メモリに格納されるクラス レベルのメンバーです。 Final この修飾子は、変数、メソッド、またはクラスへのさらなる変更を制限するために使用されます。 Final として宣言された変数の値は、その値を取得した後は変更できません。 Final メソッドをサブクラスでオーバーライドしたり、Final クラスのサブクラスを作成したりすることはできません。 Abstract この修飾子はクラスまたはメソッドで使用できます。この修飾子を変数やコンストラクターに適用することはできません。抽象として宣言されたメソッドはサブクラスで変更する必要があります。抽象宣言されたクラスをインスタンス化することはできません。同期 この修飾子は、複数のスレッドを制御するために使用されます。

See all articles