2012-01-30 8 views
17

私は​​キーワードとリエントラントロックをJavaで使用しましたが、どのように違うのか、特定の状況に適しているのか分かりません。同期ロックとリエントラントロックの違いは?

​​はどのように使用する必要がありますか、またリエントラントロックを使用する必要がある場合は、どのようにしたらいいですか?

答えて

0

私は常に同期を「最小抵抗のハック」と考えていました。それだけで動作し、ほとんどの人がどのように動作するのか理解していますが、重度の並行性の下でデザインに影響を与える可能性のある弱点があります。他のクライアントがそれをつかんで保持することができない場合、クライアントの事実上、オブジェクトの同期ロックに直接アクセスすることは事実です。つまり、デフォルトの同期によって実装されるロックは、オブジェクトの内部ロック機構を効果的に「公開」します。 Yuk。自発的なサービス拒否のために自分自身を設定するような。

クラスの内部に再入可能ロックを設定する(または同期を使用しないで、コンストラクタ内で新規作成した内部オブジェクトの一部を同期化するなど)クラスの進化に伴い、この内部同期をどこに適用するかを覚えなくてはならないという複雑さが増します。

+0

アクセス不可能なロックオブジェクトに対して 'synchronized'ブロックを使用するのではなく、' synchronized'修飾子をアクセス可能なメソッドに適用した場合のみ、「任意のクライアントはオブジェクトの同期ロックに直接アクセスできます。 – Raedwald

+0

うん。それは私が言ったことです。メソッドでデフォルトのsynchronizedキーワードを使用すると、ロックを効果的にパブリッシュします。これを回避するには、同期ブロックを内部にします。 –

21

ReentrantLockは次のとおりです。

同じ基本的な動作と同期 メソッドや文を使用してアクセスしますが、拡張された機能を持つ暗黙の監視ロックなど セマンティクスを持つリエントラント相互排他ロック。

拡張機能が含まれます:

  1. モニターごとに複数のcondition variableを持っている能力を。 synchronizedキーワードを使用するモニターには、1つしか含めることができません。これは、リエントラントロックが複数のwait()/ notify()キューをサポートしていることを意味します。
  2. ロックを行う機能fair。同期ブロックは不公平です。

    "[fair]は、最長待機スレッドへのアクセス許可をロックします。そうしないと、特定のアクセス順序が保証されません。

  3. ロックが保持されているかどうかを確認する機能。
  4. ロックで待機中のスレッドのリストを取得する機能。

リエントラントロックの欠点は以下のとおりです。

  1. は、インポート文を追加する必要があります。
  2. try/finallyブロックでロック取得をラップする必要があります。これはsynchronizedキーワードよりも醜いです。
  3. ​​キーワードをメソッド定義に入れることができます。これにより、ネストを減らすブロックが不要になります。

概要

​​キーワードは、構文的に進歩していますが、リエントラントロックは、より多くの機能を備えています。

0

このサイトでは、JavaのReentrantLockとsynchronizedキーワードの違いを明確に説明しました。私はそこからコピーして貼り付けます。

http://javarevisited.blogspot.in/2013/03/reentrantlock-example-in-java-synchronized-difference-vs-lock.html

1)ReentrantLockのと同期したキーワード間のもう一つの重要な違いは、公正です。 synchronizedキーワードは公平性をサポートしていません。 reentrantLockのインスタンスを作成しながら、フェアネスプロパティを指定してReentrantLockを公平にすることができます。 Fairnessプロパティは、競合が発生した場合に最長待機スレッドにロックを提供します。

2)同期ロックと再入可能ロックの第2の違いは、tryLock()メソッドです。 ReentrantLockは便利なtryLock()メソッドを提供しています。このメソッドは、他のスレッドが使用できるかどうかに関わらずロックを取得します。これにより、Javaアプリケーションでのロックを待機するスレッドのブロックが減少します。

3)JavaのReentrantLockとsynchronizedキーワードの違いに注目すると、Lockを待っている間にスレッドを中断する能力があります。同期されたキーワードの場合、スレッドはロックを待ってブロックされ、無期限に制御できません。 ReentrantLockはlockInterruptibly()というメソッドを提供しています。ロックを待っているときにスレッドを中断させるために使用できます。同様に、timeoutを指定したtryLock()は、ロックが一定期間利用できない場合にタイムアウトに使用できます。

4)ReentrantLockは、ロックを待機しているすべてのスレッドのリストを取得する便利な方法も提供します。

関連する問題