Java で、グローバル スコープを持つオブジェクトを作成しました。
ある時点で、私は別のスレッドにいて、グローバル オブジェクトが現在いずれかのスレッドによってロックされているかどうかを知る必要があります。
- クリシュナ
Java で、グローバル スコープを持つオブジェクトを作成しました。
ある時点で、私は別のスレッドにいて、グローバル オブジェクトが現在いずれかのスレッドによってロックされているかどうかを知る必要があります。
これは、通常のオブジェクトで synchronized キーワードを使用することはできません。
おそらく、tryLock() メソッドなどを提供するjava.lang.concurrent.locks.Lockを実装する「ロック」オブジェクトが必要です。
これにより、スレッドはロックの取得を試みることができ、ロックが現在他の場所でロックされていない場合は true を返します。
もちろん、この場合、すぐにロックを解除する必要があるかもしれません。そうしないと、スレッドが他のスレッドの進行を妨げます。
ここでの大きな問題は、「現在」を定義することです。
私が提案できる最善の方法は、タイムアウトなしでロックを取得しようとすることです。ロックを取得すると、グローバルオブジェクトが「別のスレッド」によってロックされていることを確認できます。そうでない場合は、オブジェクトがロックされているか、他のスレッドによってロックされていない可能性がありますが、失敗したロックの試行が戻っている間にロックが解放された可能性があります。ロックの試行中に「異なるスレッド」の優先度を可能な限り高くすると、より信頼性の高い結果を得ることができるはずです。
このテストが一時的なデバッグ、最適化、または統計目的である場合は問題ありませんが、成果物の機能を実装するためにこのようなものを使用しないでください。
Rgds、マーティン