問題タブ [reentrantreadwritelock]
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.
multithreading - 読み取りロックを待機している読み取りおよび書き込みロック スレッド
私は、公正な値が true の ReadWriteLock インスタンスを作成したマルチスレッド プログラムを持っています。このアプリケーションは応答を停止しました。
以下は、スレッド ダンプに基づく調査結果です。1 つのスレッドが読み取りロックを取得し、実行中の DB 操作でブロックされました。長い間ロックを解除しませんでした。
上記のスレッド以外に、あと 3 つのスレッドがあります。1 つのスレッドが書き込みロックの取得を待機しています。一方、他の 2 つのスレッドが読み取りロックの取得を待機しています。
質問は、なぜ 2 つのスレッドが読み取りロックを待機しているのかということです。Fair Value が true であり、書き込みロックを要求しているスレッドが読み取りロックを要求している 2 つのスレッドよりも先に来たために発生しているのでしょうか? 書き込みを要求するスレッドが先に来た場合、システムは読み取りロックを要求するスレッドをブロックしますか?
java - すでにロックが解除されている可能性のあるロックで unlock() を呼び出すのは安全ですか?
この例では:
ステートメント内のロック解除が実行された場合、ブロックmLock.writelock.unlock()
内で が呼び出されるとどうなりますか?finally
if
このコードは安全ですか? または、ロックを解除する前にロックがかかっているかどうかを確認する必要がありますか?
java - 同期する変数ごとに 1 つの ReentrantReadWriteLock インスタンス?
いくつかのコードをいくつかのグローバル変数で並列化します。ReentrantReadWriteLock を使用します。スレッドセーフにしたい変数ごとに ReentrantReadWriteLock の独自のインスタンスが 1 つ必要であることを正しく理解しましたか?
つまり、すべてのスレッドが項目をアタッチできる 2 つのリストがあり、すべてのスレッドがそのリストから項目を読み取ることがあります。その場合、次のようなものを実装します。
データベース接続(プール)、ロガー、その他のリストなど、さらに多くの変数がある場合はどうでしょうか。
新しい ReentrantReadWriteLock を作成する必要がありますか、それとも何か不足していますか? インターネット上のサンプルは、1 つの変数のみを処理します。
前もって感謝します。
java - ReadWriteLock のアップグレードが許可されないのはなぜですか?
ReadWriteLock
ReentrantReadWriteLock
ダウングレードは実装によって許可されています (tryLock()
以下の例では常に が返されますtrue
):
同様の方法でロックのアップグレードを許可しない理由は何ですか? 以下の書き込みロックのtryLock()
メソッドは、読み取りロックを保持している他のスレッドがない場合、デッドロックのリスクなしで安全に戻ることができます。true
java - Eclipse での ReentrantReadWriteLock デッドロックのデバッグ
時折デッドロックするアプリケーションがあります (月に 1 回など)。
今、Eclipseデバッガーで実行しているときに、初めてこの状態を再現することができました。
すべてのスレッドが WriteLock が解放されるのを待っているようです。
私が必要としているのは、(200 個の) スレッドのうちのどれがロックを保持しているかを調べる方法です。
しかし、Eclipse でスレッドを一時停止して検査しても結果は得られませんでした。これは、スレッドが手動で中断されたため、表示したい変数にアクセスできないことが Eclipse から通知されるためです。
このデッドロックにもう一度入ることができるかどうかわからないので、アプリケーションを再起動したくありません。
では、ロック ホルダーを見つけるにはどうすればよいでしょうか。
編集:私はすでにjstackを試してスレッドダンプを作成しました。しかし、ロックを待っているスレッドしか見つかりませんが、それを保持しているものはありません。
java - ReentrantReadWriteLock はスピンロックとして実装されていますか?
どのように機能しReentrantReadWriteLock
ますか?スピンロックですか?
質問は、Elasticsearch から来ています。
すべてのスナップショットでホット スレッドが発生し、同時に CPU 使用率が高くなります。スピンロックのようです。
java - ReentrantReadWriteLock - 読み取りロックのため、書き込みロックを取得できません
書き込みロックの取得中に問題が発生し、 ReentrantReadWriteLockを使用して何らかの操作を行っています
ClassA と ClassB という 2 つのクラスがあります ClassA は書き込みロックを保持しています ClassB は読み取りロックを保持しています
ユーザーが更新/作成できる UI があります。このイベントが発生すると、ClassA の書き込みロックがアクティブになり、ClassB のリーダーがブロックされます。
しかし、不思議な理由で、ClassA は書き込みロックの取得を (無限に) 待っています!!
異なるスレッドが取得したすべてのロックをリセットしてから、書き込みロックを取得できますか? 別の方法があれば提案してください..
java - Java ReadWriteLock 再入可能
こんにちは、Java の ReadWriteLock について読んだことがありますが、その再入可能部分を理解しているかどうかはわかりません。1 つのメイン スレッドのみを使用して再入可能性を示す 2 つの簡単なコード例を次に示します。
そして2番目の例
最初のものでは sysout が実行されますが、2 番目のものでは実行されません。なぜですか? 両方のロックは同じスレッドによって取得されるため、ここでは再入可能な状況がありますが、書き込みロックが最初に取得された場合にのみ入口が達成されます。その他の操作 (書き込みまたは読み取り)。