[解決済み] java.util.concurrent.locks.Condition はどのように機能するのですか?
2022-03-02 05:53:26
質問
Java 8 のドキュメントを読むと
java.util.concurrent.locks.Condition
インターフェイスを使用する場合、次のような例が挙げられます。
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
そこで一番の疑問は、「条件とはどのように機能するのか」ということです。
-
待ちが始まるとロックを解除するのですか?(
notFull.await()
など)? -
異なるスレッドが同じロックを取得し、そのロックが解除されるまで移動することは可能か?
signal()
条件を満たすと、他のスレッドが目を覚ましますか? -
この例では、あるスレッドがバッファを待っていると、デッドロックになると思いました。
空でない
他のスレッドがロックを取得し、バッファを空にすることはできません。
signal()
条件を満たしたので、ロックを解放します。 バッファが一杯にならないのを待つスレッドによってロックが解放されていない場合 ?
これらは初心者の質問です。よろしくお願いします。
ありがとうございました。
解決方法は?
-
はい、その通りです。条件を待つとすぐにロックを解除します。
await/signal/signalAll
と同じ挙動をします。wait/notify/notifyAll
- ReentrantLock は排他的ロックなので、1 つのスレッドだけがロックを取得できます。
-
1を参照してください。スレッドが
signal
またはsignalAll
を待っているスレッドまたはすべてのスレッドをそれぞれ解放します。Condition
そのため、そのスレッドまたはそれらのスレッドは、再びロックを取得する資格があります。しかし今のところ、ロックはまだsignal
またはsignalAll
を呼び出して明示的にロックを解放するまで。lock.unlock
. その後、解放されたスレッドは再びロックを取得しようとすることができ、ロックを取得できたスレッドは再び条件を確認することができます (今回、条件とはcount == items.length
またはcount == 0
この例では)、もしそれが問題なければ、それは続行されます。await
を再度実行し、ロックを解放して他のスレッドで利用できるようにします。
関連
-
[解決済み] javascriptでExpression言語を使うには?
-
[解決済み] javaでメソッドを呼び出すプログラムのエラー修正
-
[解決済み] JavaFX 同じパッケージ内なのに「場所が必要です。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] ThreadLocal変数はいつ、どのように使用すればよいですか?
-
[解決済み】サーブレットはどのように動作するのですか?インスタンス化、セッション、共有変数とマルチスレッド
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] maven. -source 1.5ではラムダ式がサポートされていません。
-
[解決済み] getContentPane()は具体的に何をするのですか?
-
[解決済み] Cloneable throws CloneNotSupportedException
-
[解決済み] Oracle DB : java.sql.SQLException: 閉じた接続
-
[解決済み] double 型を Int 型に変換、切り捨て
-
[解決済み] ORA-01654: インデックスを拡張できません。
-
[解決済み] JavaにおけるMouseListenerとMouseAdapterの違いについて
-
[解決済み] eclipseからTomcatに物理的に発行されるmyjspはどこにあるのでしょうか?
-
[解決済み] java.lang.ClassCastException: java.lang.Long を java.lang.Integer にキャストできない(java 1.6
-
[解決済み] 文字列の巻き方