実行時に、指定されたオブジェクトのロックを保持しているスレッドの名前をプログラムでチェックできますか?どのJavaスレッドがロックを保持しているかをプログラムで判断する
答えて
現在のスレッドが通常のロック(Thread.holdsLock(Object)
)を保持しているかどうかだけを知ることができます。ネイティブコードなしでロックを持つスレッドへの参照を取得することはできません。
しかし、スレッドを使って複雑なことをしているなら、おそらくjava.util.concurrentパッケージに慣れておきたいと思うでしょう。 ReentrantLock
では、所有者を取得することはできますが(保護されたメソッドなので、これを拡張する必要があります)。アプリケーションによっては、並行性パッケージを使用すると、結局のところロックの所有者を取得する必要がないことがわかります。
デッドロックの原因を特定するのに便利な、スレッドダンプをstderrに発行するようにJVMに通知するなど、ロック所有者を見つけるプログラムではない方法があります。
実行jconsole。これはJava SDKに含まれており、コマンドラインから実行されます。私はどのOSを使用しているのかよく分かりませんが、Windows上ではJavaプロセスのPIDを渡すことができます。問題の原因となっているスレッドを見つけるのに役立ちます。また、YourKitのような市販のプロファイラやその他のプロファイラを使用することもできます。
JMXを使用すると、保持されているロックの検索など、あらゆる面白いことができます。実際のオブジェクトを取得することはできませんが、クラスとIDのハッシュ値(一意ではありません)を取得します。このような
1.5では、あなたはすべてのスレッドを検索し、各1の状態を取得することができ、例えば:
Map<Thread,StackTraceElement[]> map = Thread.getAllStackTraces();
for (Map.Entry<Thread, StackTraceElement[]> threadEntry : map.entrySet()) {
log.info("Thread:"+threadEntry.getKey().getName()+":"+threadEntry.getKey().getState());
for (StackTraceElement element : threadEntry.getValue()) {
log.info("--> "+element);
}
}
Thread.getStateは、などを待って、あなたのスレッドがブロックされているかどうかについての情報を提供します、jdk api ThreadState
スレッドで保持されているロックをリフレクションで取得できます。これはjava 1.6でのみ動作します。あなたが問題になっているロックと比較して、それらにidentityHashCodeを使用することができますLOCKINFOのオブジェクトが存在するオブジェクトThreadInfoにこれらのそれぞれに
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] ti = bean.getThreadInfo(bean.getAllThreadIds(), true, true);
。
ロックを取るときに変数を使用して現在のスレッドを保持し、他の誰かがロックを使用しようとしている場合は、変数を使用して印刷できます。
Thread holderOfLock = null;
Object theLock = new Object();
public void doStuff()
{
if(holderOfLock != null)
{
//get and print name of holderOfLock-thread or get stacktrace etc.
}
synchronized (theLock)
{
holderOfLock = Thread.currentThread();
//do stuff...
holderOfLock = null;
}
}
あなたは、そのオブジェクトのwait()
またはnotify()
メソッドを呼び出すことにより、特定のオブジェクトのロックを確認することができます。オブジェクトがロックを保持していない場合は、llegalMonitorStateException
がスローされます。
2- holdsLock(Object o)
メソッドを呼び出してください。ブール値が返されます。
、それが現在のスレッドによって
final ReentrantLock lock = new ReentrantLock();
lock.isHeldByCurrentThread();
- 1. Javaでは、スレッドが実行されているかどうかをどのように判断しますか?
- 2. Java PipedInputStreamスレッドは、ロックを保持している他のスレッドがないBLOCKED状態ですか?
- 3. 複数のスレッドがJavaの同じモニターでロックを保持できますか?
- 4. ArrayListが整っているかどうかを判断する汎用メソッド(Java)
- 5. ユーザーがパッケージのライセンスを取得しているかどうかをプログラムで判断できますか?
- 6. JAVAでは、インポートがどこから来ているかをどのように判断するのですか?
- 7. あるスレッドは、別のスレッドがクラッシュしたかどうかを判断できますか?
- 8. Windowsサーバが特定のプログラムを実行しているかどうかをLINUXから判断する方法
- 9. 予期しないフローエラーオブジェクトが持っているかどうかを判断する次の型を考える
- 10. ビデオが再生されているかどうかをプログラムで判断することはできますか?
- 11. ソフトキーボードの音声のディクテーションが有効になっているかどうかをプログラムで判断します。
- 12. Javaスレッドが中断していない
- 13. iOS10 Todayウィジェット - iPhoneがロックされているかどうかを判断する方法は?
- 14. Javaスレッドの開始時期を判断する方法はありますか?
- 15. 、Firefoxはページをレンダリングしているかどうかを判断
- 16. ブラウザが印刷をサポートしているかどうかを判断する
- 17. 翻訳単位内でラベルが定義されているかどうかをプログラムで判断する
- 18. どのメソッド/リソースがJavaでスレッドを保持しているかを分析するには?
- 19. どのURLLoaderがプログラムで失敗したかをどのように判断するのですか?
- 20. アクセストークンがページアクセストークンであるかユーザーアクセストークンであるかをプログラムで判断する
- 21. Cordova:デバイスアプリでページが開かれているかどうかを判断する
- 22. BSTかどうかを判断する
- 23. ボディが衝突しているかどうかを判断する - Cocos2d/Box2D
- 24. プログラムがLinuxにインストールされているかどうかをC++で判断する
- 25. .NETアセンブリがGACにインストールされているかどうかをプログラムで判断する方法
- 26. JavaがWindowsシステムにインストールされているかどうかをプログラムで判断するにはどうすればよいですか?
- 27. どのPowerShellスナップインがインストールされているかをプログラムで判断する方法
- 28. メソッドまたはメンバを保護できるかどうかを判断する
- 29. mysql接続が存在するかどうかをプログラムでどのように判断しますか?
- 30. EclipseプラグインがUIに貢献するかどうかをプログラムでどのように判断しますか?
を保持されている場合uがチェックすることができ-entrantロック再ある場合は、Javaを意味することを示すために、あなたのタイトルおよびポストを変更してください。タグは、質問に関する重要な情報が置かれる唯一の場所であってはならない。 –