[解決済み] Javaでブロックされないようにオブジェクトがロック(同期)されているかどうかを判断するにはどうすればよいですか?
質問
私はレコードのセット(レコードA、レコードB、など...)を持つメモリ内のテーブルを含むプロセスAを持っています。
さて、このプロセスは、レコードに影響を与える多くのスレッドを起動することができ、時には我々は同じレコードにアクセスしようとする2つのスレッドを持つことができます - この状況は拒否する必要があります。具体的には、レコードが1つのスレッドによってロックされた場合、私は他のスレッドを中止したい(私はBLOCKまたはWAITを望んでいない)。
現在、私はこのようなことを行っています。
synchronized(record)
{
performOperation(record);
}
しかし、これでは問題が発生します。Process1が処理を実行している間、Process2が来ると同期されたステートメントでブロック/待機し、Process1が終了すると処理が実行されるからです。代わりに、私はこのようなものが欲しいのです。
if (record is locked)
return;
synchronized(record)
{
performOperation(record);
}
これを実現するための手がかりがあれば教えてください。 何かヒントがあれば、ぜひ教えてください。 ありがとうございます。
どのように解決するのですか?
一つ注意すべきは インスタント というのは、そのような情報を受け取った時点で、その情報は古くなってしまうからです。言い換えると、誰もロックしていないと言われたのに、それを取得しようとすると、チェックしてから取得しようとするまでの間に別のスレッドがロックを取り出したためブロックされる可能性があります。
Brian が指摘するとおり
Lock
を指すのは正しいのですが、あなたが本当に欲しいのはその
tryLock
メソッドです。
Lock lock = new ReentrantLock();
......
if (lock.tryLock())
{
// Got the lock
try
{
// Process record
}
finally
{
// Make sure to unlock so that we don't cause a deadlock
lock.unlock();
}
}
else
{
// Someone else had the lock, abort
}
を呼び出すこともできます。
tryLock
を、待ち時間を指定して呼び出すこともできます。つまり、10分の1秒だけ取得を試みて、取得できなかったら中止するというようなことができます(例)。
(私が知る限り、Java API が "built-in" ロックに対して
Monitor
クラスが.NETでそうであるように。そしてまた、スレッドに関して言えば、私が両プラットフォームで嫌いな他の多くのことがあります - たとえば、すべてのオブジェクトが潜在的にモニターを持つことです!)
関連
-
ジャバアレイ
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Javaで配列に特定の値が含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
強制型変換について
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
シェルコマンドやスクリプトのJavaコール
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
アクセス制限の解決方法: ---- in Java
-
htmlとwordの相互変換の実装(画像あり)