1

通常のJavaスレッド理論について質問があります。

スレッドAは、xObjなどのオブジェクトをロックしました。ここで、スレッドBは、スレッドAがオブジェクトxObjをすでにロックしていることをどのようにして知るのでしょうか。

これがJavaでどのように実装されているか。

前もって感謝します。

回答ありがとうございます...ここで明確にしておきたいのですが...これを実装する必要はありません。私の懸念は、Javaがそれをどのように実装したかです。スレッドBは、誰かがすでにロックを取得していることをどのように知るのでしょうか。 Object.MayはObjectクラスであるか、他のクラスがこれを実装しています。

4

4 に答える 4

1

スレッド A が xObj などのオブジェクトをロックしました。スレッド B は、スレッド A がオブジェクト xObj を既にロックしていることをどのようにして知るのでしょうか。

話しているロックの種類によって異なります。

  • プリミティブ ミューテックスの場合、あるスレッドは別のスレッドがミューテックスを保持しているかどうかをテストすることはできません。(ただし、ロックを保持しているかどうかをテストできます...)

  • インターフェイスも同様にこれLockをサポートしていません。

  • このReentrantLockクラス、これを見つけるためのメソッドを提供します: を参照してくださいReentrantLock.getOwner()。ただし、これはメソッドであるため、メソッドを一般に利用できるようにする場合はprotected、のサブクラスを作成する必要があることに注意してください。ReentrantLock


また、そのような方法の価値についても疑問を呈します。呼び出しが行われた瞬間にどのスレッドがロックを所有しているか (存在する場合) しかわかりません。一瞬後、所有者が変わった可能性があります。

対照的に、Thread.holdsLock()信頼できる情報を提供します...ただし、ほとんどの状況では役に立たない情報です.

于 2012-10-11T10:02:59.397 に答える
1

以下のオプションがあります

  1. Thread.holdsLock(Object object)この場合、A に B のスレッド インスタンスが必要になります。
  2. ReentrantLock.getOwner()ReentrantLock.hasQueuedThread(スレッドスレッド)

しかし、B が A が lock を持っていることを知る必要はありません。ロックが解放されると、それを待っているスレッドがなければ、B が使用できるようになります。

于 2012-10-11T10:05:17.907 に答える
0

-スレッドがlockオブジェクトを取得すると、すべてのメソッドはそのスレッドをsynchronized介してのみアクセスでき、ロックを解除するまではアクセスできません。

-オブジェクトのをThread A持っていて、同じオブジェクトのロックにアクセスしようとすると、それです。ロックはAであるため、スレッドBにとっては重要ではありません。そのロックは誰とでもありますが、使用可能なロックです。そうでない場合、スレッドBは、スレッドAによってロックが解放されるまでブロック状態に移行します。lockThread Bcan't access

于 2012-10-11T10:01:07.863 に答える
0

どのロックについて話しているのですか?たとえばReentrantLockの場合は、単に呼び出すことができます

 lock.getOwner()

編集:

synchronized(xObj) { } 

あなたが暗示しているようにロックではありません。概念的にはモニターロックに近いです。同期ブロックを使用して機能が制限されているため、ReentrantLock などのクラスが存在します。ドキュメントから

同期されたメソッドとステートメントを使用してアクセスされる暗黙的な監視ロックと同じ基本的な動作とセマンティクスを持つ再入可能な相互排他ロックですが、機能が拡張されています。

于 2012-10-11T09:55:25.733 に答える