web-dev-qa-db-ja.com

Java synchronizedブロックの動作を示すサンプルコード

私は学習していますJavaマルチスレッド、同期ブロックの仕組みを理解するのは難しいことがわかりました:

 synchronized(Object o){
     // do something
    }

オブジェクトoがブロックされていることを示すコード例をいくつか教えてください。私がこれを理解する方法として、同期ブロックが実行されている間、別のスレッドからオブジェクトoへのアクセスはブロックされますか?

22
CaiNiaoCoder

同期とは、オブジェクトまたはブロックが同期として宣言されている場合、一度に1つのプロセスのみがそのオブジェクトまたはブロックにアクセスできることです。他のプロセスは、オブジェクトまたはブロックを使用可能になるまで取得できません。 」には2つの状態が設定およびリセットされます。プロセスが1つのオブジェクトを要求すると、ロック値が設定またはリセットされているかどうかがチェックされます。その1つのオブジェクトに応じて、同期中のプロセスで使用できます。例でよりよく理解するには、このリンクを参照してください。 ここにリンクの説明を入力してください

1
Mihir Bera

ほとんどの答えは同期化の意味をカバーしているので、言及されていないポイントを1つ追加したいと思います。メソッドを同期するか、またはsynchronizedを使用してブロックを囲むと、1つのスレッドがオブジェクトで同期ブロックを実行しているときに正確に1つのアトミック操作として操作/操作のセットが実行され、スレッドが完了するまで他のスレッドがブロックに入ることはできません実行し、ブロックに入るときに取得したロックを解除します。

したがって、同期ブロックは、コードステートメントの束の原子性を保証します。

@lucifierが指定したものとは異なり、Synchronizingとvolatileは同じ目的を果たしません。volatileは、2つのスレッドが相互に通信し、個々のcache.itから値を取得する代わりに、メインメモリから最新の更新値を取得することを保証します。実行の「前に発生する」動作を保証します。

たとえば、変数をvolatile(volatile int i = 10;)として定義すると、非同期メソッドでインクリメント操作(i ++;)を実行しても、(i ++)が同期ブロックに囲まれている場合は同じ動作をしません。

0
k.explorer