16

Java では、?ReentrantLock.lock()ReetrantLock.unlock()同じロック メカニズムを使用します。synchronized()

私の推測では「いいえ」ですが、間違っていることを願っています。

例:

スレッド 1 とスレッド 2 の両方が以下にアクセスできるとします。

ReentrantLock lock = new ReentrantLock();

スレッド 1 が実行されます。

synchronized (lock) {
    // blah
}

スレッド 2 の実行:

lock.lock();
try {
    // blah
}
finally {
    lock.unlock();
}

スレッド 1 が最初にその部分に到達し、次にスレッド 1 が終了する前にスレッド 2 に到達すると仮定します。スレッド 2 は、スレッド 1 がsynchronized()ブロックを離れるのを待ちますか、それとも先に進んで実行しますか?

4

3 に答える 3

15

いいえ、スレッド2はlock()、スレッド1がsynchronized同じ上にある場合でも可能lockです。これはドキュメントが言っていることです:

Lockインスタンスは単なる通常のオブジェクトであり、それ自体を同期ステートメントのターゲットとして使用できることに注意してください。Lockインスタンスのモニターロックを取得することは、そのインスタンスのlock()メソッドを呼び出すこととは特定の関係がありません。混乱を避けるために、独自の実装内を除いて、この方法でLockインスタンスを使用しないことをお勧めします。

于 2010-05-24T23:40:58.343 に答える
9

2 つのメカニズムは異なります。実装/パフォーマンスに関して:

状況によっては、明示的なロックの方がパフォーマンスが向上する場合があります。私が Java 5 で実行したロック メカニズムのこの比較を見ると、その特定のテスト (配列にアクセスする複数のスレッド) で、「不公平」モードで構成された明示的なロック クラス (黄色と水色の三角形) では、より多くのことが許可されていることがわかります。単純な同期 (紫色の矢印) よりもスループットが高くなります。

(また、Hotspot のより最近のバージョンでは、synchronized のパフォーマンスが改善されているとも言わなければなりません。最新バージョンや実際には他の状況ではあまり改善されていない可能性があります。これは明らかに、1 つの環境での 1 つのテストです。)

機能面:

  • 同期メカニズムは最小限の機能を提供します (ロックとロック解除が可能で、ロックは全か無かの操作であり、OS 作成者が決定したアルゴリズムにより影響を受けます) が、組み込みの構文といくつかの監視の利点があります。 JVMに組み込まれています。
  • 明示的なロック クラスは、より詳細な制御を提供します。特に、「公平な」ロック、タイムアウト付きのロック、ロックの動作を変更する必要がある場合のオーバーライドを指定できます...
于 2010-05-25T02:18:29.510 に答える
0

Account クラスで残高を静的にしたのはなぜですか? 静電気を除去すると、動作するはずです。

また、スレッドの使用法について質問があります。TestMain で新しいスレッドを作成し、WithdrawRequests や DepositRequests などのランナブルを割り当てます。ただし、これらのランナブルのコンストラクター内に新しいスレッドを作成します。これにより、run メソッドが 2 回実行されます。

于 2011-05-03T22:14:39.760 に答える