問題タブ [reentrantlock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
364 参照

java - Java のネストされたモニター

Java で ReentrantLock を使用している場合... スレッドがオブジェクトのロックを持っていて、別のオブジェクトの別のロックを取得しようとすると、最初のロックを解放しますか?それとも保持しますか?

0 投票する
2 に答える
1005 参照

java - ReentrantLock がうまくいかない

コードが正しく動作しない理由がわかりません。問題は、ReentrantLock が ThreadClass.run() でのメソッド呼び出しをロックしないことです。

ThreadClass でロックされていると想定されるメソッドのリソース クラス

スレッドクラス

メインクラス

run() の lock で囲まれたコードは「同期」する必要があると想定されているため、Resourse オブジェクトのメソッドにアクセスできるスレッドは 1 つだけになります。実際にはそうではありません。このコードでは、2 つのスレッドが同時にメソッドにアクセスできることを意味する繰り返しの数値が返されます。本当に単純な問題であることは知っていますが、解決方法がわかりません。助けてくれてありがとう。

アップデート:

了解。このコードは問題なく動作します (setIncrement() を削除し、関連するすべてのロジックを getIncrement() に入れました)。

0 投票する
2 に答える
1035 参照

java - Java、ロック、条件 - 待機中のスレッドを起こさないシグナル

数時間立ち往生している問題があり、その解決方法が本当にわかりません。それは非常に簡単です-私にはいくつかのスレッドがあり、そのうちの1つは他のスレッドからの信号を待つ必要があります。なんとなく、条件合図しても……何も起こらない!スレッドはまだ眠っているようです。すごく変な話なんですが、よくわからないのは私のせいかもしれません…

ここに私のコードの一部があります:

body.signalAll(); と確信しています。その条件で待機しているスレッドがあるときに呼び出されます-確認したところ、デバッガーはその行を何度も通過しました。しかし、「待ってます」というセリフはスレッドに一度だけ出て、「起きました」は一度も出てこない..

アイデア、修正方法、または何を確認する必要がありますか? ほぼ全部試した...

お時間をいただきありがとうございます。

0 投票する
1 に答える
112 参照

java - クラスに 2 つの ReentrantLock を持つ利点は何ですか?

このコードがある場合:

lock1との違いは何ですかlock2、それは単純なエイリアスですか、それとも別のロジックがありますか?

0 投票する
1 に答える
487 参照

java - 同期に対して ReentrantLock を使用する利点

同期よりも ReentrantLock を使用する利点がもう 1 つあります。

以下のコードは、クリティカルセクションで例外が発生してもロックが解除されることを示しています ( ReentrantLock を使用)

今すぐ同期を使用して

両方のコードを比較すると、同期ブロックを使用することにはもう1つの欠点があることがわかります。つまり、クリティカルセクションで例外が発生した場合、ロックを解放できないことです。

私は正しいですか?

間違っている場合は修正してください。

同期ブロックで例外が発生した場合、ロックを解除する方法はありますか?

0 投票する
2 に答える
815 参照

java - ロックなしの Java でのスレッド間の通信

だから私が達成したいのは、2つのスレッドが順番にタスクを実行することです。当初、私が持っていた質問は 1 つだけでした。

  1. ロックを使用せずにタスクを順番に実行する 2 つのスレッドを実現するにはどうすればよいですか? ロックが必要ない理由は、2 つのスレッドがアクセスしようとしている共通のリソースがない場合にロックを使用するのは愚かだと感じているからです。

だから私はコードの小さな例を作るつもりでしたが、ロックを使ってもそれを機能させることができないことに気付きました。私の 2 番目の質問は次のとおりです。コードを期待どおりに動作させるにはどうすればよいですか? 私の見方では、うまくいくはずですが、それは私だけです:)

  1. Thread1 はメッセージを出力します
  2. スレッド 1 は、スレッド 2 がメッセージを出力できることを通知します
  3. Thread2 はメッセージを出力します
  4. Thread2 は、Thread1 が最初からやり直すことができることを通知します

0 投票する
1 に答える
180 参照

java - スレッドは、他のスレッドによって既に取得されている ReentrantLock を取得します

WebLogic 12c で実行されているアプリケーションは、メッセージを取得するキューが FIFO として構成されているキューイング システムからメッセージを取得しています。Spring を使用して取得機能を構成しており、コンテナー (org.springframework.jms.listener.DefaultMessageListenerContainer) とメッセージ リスナー (org.springframework.jms.core.support.JmsGatewaySupport) の両方がシングルトンです。さらに、そのコンテナーはデフォルトで WorkManager をタスク実行者として構成しています。メッセージが期待される順序 (キューに送信される順序) で処理されることを保証するために、リスナーで ReentrantLock を使用し、メッセージが 1 つずつ取得されて処理されることを期待していました。リスナーのコードは次のとおりです。

2 つのメッセージが正しい順序でキューに配置され、その順序で消費されますが (キューは FIFO であることを思い出してください)、次の図に示すように、アプリケーションによって 2 つのメッセージが並列に処理されます。ログチャンク:

なぜこの動作が得られるのでしょうか? 何か案が?

よろしくお願いします。