2017-01-03 11 views
2

Javaでは、スレッドt2が現在別のスレッドによって使用されている同期からロックを取得しようとするとt1の場合、t2は実行可能からブロックに切り替わります。正しい? ReentrantLockさんとはどうですか?スレッド、ロック、および条件の状態

スレッドt1がロックの使用を終了した場合、t2は自動的に実行可能に戻りますか、notifyAll()を使用する必要がありますか?条件なしのReentrantLockの使用についてはどうですか?条件を使用していない場合は、スレッドt2に実行可能に戻す方法を通知するにはどうすればよいですか?条件なしでリエントラントロックを使用することは、賢明か、または可能ですか?

この質問にはすでに回答済みです(見つからなかった場合)、私にリンクしていただければ幸いです。

答えて

4

ブロックされた状態と待機状態が混乱しているようです。 Blockedは、スレッドがロックを獲得しようとしていることを意味し、ロックできません。待機中はスレッドが休止状態であることを意味します。それは通知を受け取るまで、またはそれが待ち時間(タイムアウト、タイムアウト値で呼び出された場合は偽の起床)から戻ってくるまで、ハングアウトしています。

ロックが利用可能になると、OSスケジューラはどのブロックスレッドがロックを取得するかを決定する必要があります。ロックを取得するために選択したスレッドは実行可能になります。

so notifyは、ブロックされたスレッドではなく、待機中のスレッドに関係します。ロックを持っているが、進行できないと判断したスレッド(待機している状態が真ではないことを検出したスレッド)は、ロックを待機し、ロックを解除して休止状態になります。 notifyを使用して、ロックを待機しているスレッドを起動するようにスケジューラに指示します。スレッドが起動すると、waitメソッドを終了する前に以前に解放したロックを再度取得する必要があります。

ReentrantLockの基本的な動作は、リエントラントロックで複数の条件を設定できる点を除いて、組み込みロックに似ています。 ReentrantLockには、呼び出すための独自のメソッドがあります(待機して通知するのではなく、待機して信号を送ります)。 ReentrantLockで条件を使用するのは、スレッドが待機して通知を受け取るときに、スレッドが関連する条件でのみ待機するように異なる条件を使用する場合です。

+0

彼は単に "待機中"という言葉を "実行可能"としていると思う。 –

+0

私の混乱は、私が読んでいる本(Cay S. Horstmannによるオブジェクト指向設計とパターン)に由来しています。この本では、以下の記事を読むことができます[スクリーンショット](http://imgur.com/a/qYm36)。これは単純化されているのですか? –

+0

@erikpは私の単純化のようです - [JavaDocs of Thread.State](https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.State.html) – Hulk

0

スレッドt2が、別のスレッドt1によって現在使用されているロックで同期しようとすると(たとえば、t1がすでに同じロックの同期ブロックに入っているときに同期ブロックを入力しようとすると)、t2がブロックします、 はい。これは、ReentrantLockクラスを含むリエントラントロックにも当てはまります。デフォルトのロックはJavaではリエントラントであることに注意してください(詳細は後述)。

t1が同期ブロックを終了するなどして、デフォルトのロックを解除すると、t2はブロック解除されます。これは言語の特徴です。しかし、ReentrantLockを使用している場合、ロックを保持するスレッドは、ロックを取得するためにReentrantLock.lock()を呼び出す必要があったのと同様に、明示的にReentrantLock.unlock()を呼び出してロックを解放する必要があります。

「リエントラント」とは、スレッド間の相互作用ではなく、1つのスレッドが同期したブロックを「再入力」できるかどうかを指します。再入可能ロックは、すでにロックを保持しているスレッドによって再びロックされる可能性があります。非リエントラントロックはできません。 Javaでは、単一スレッドが再入可能ロックを2回以上取得する場合、ロックを待機している他のスレッドがブロック解除される前に同じ回数だけロックを解放する必要があることに注意してください。デフォルトのロックでは、おそらく異なる関数呼び出しレベルで、ネストされた同期ブロックで自然に発生します。

関連する問題