2008-09-08 4 views
37

実行時に、指定されたオブジェクトのロックを保持しているスレッドの名前をプログラムでチェックできますか?どのJavaスレッドがロックを保持しているかをプログラムで判断する

+1

を保持されている場合uがチェックすることができ-entrantロック再ある場合は、Javaを意味することを示すために、あなたのタイトルおよびポストを変更してください。タグは、質問に関する重要な情報が置かれる唯一の場所であってはならない。 –

答えて

22

現在のスレッドが通常のロック(Thread.holdsLock(Object))を保持しているかどうかだけを知ることができます。ネイティブコードなしでロックを持つスレッドへの参照を取得することはできません。

しかし、スレッドを使って複雑なことをしているなら、おそらくjava.util.concurrentパッケージに慣れておきたいと思うでしょう。 ReentrantLockでは、所有者を取得することはできますが(保護されたメソッドなので、これを拡張する必要があります)。アプリケーションによっては、並行性パッケージを使用すると、結局のところロックの所有者を取得する必要がないことがわかります。

デッドロックの原因を特定するのに便利な、スレッドダンプをstderrに発行するようにJVMに通知するなど、ロック所有者を見つけるプログラムではない方法があります。

4

実行jconsole。これはJava SDKに含まれており、コマンドラインから実行されます。私はどのOSを使用しているのかよく分かりませんが、Windows上ではJavaプロセスのPIDを渡すことができます。問題の原因となっているスレッドを見つけるのに役立ちます。また、YourKitのような市販のプロファイラやその他のプロファイラを使用することもできます。

7

JMXを使用すると、保持されているロックの検索など、あらゆる面白いことができます。実際のオブジェクトを取得することはできませんが、クラスとIDのハッシュ値(一意ではありません)を取得します。このような

1.5では

There's an example in one of my weblogs.

3

、あなたはすべてのスレッドを検索し、各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

12

スレッドで保持されているロックをリフレクションで取得できます。これはjava 1.6でのみ動作します。あなたが問題になっているロックと比較して、それらにidentityHashCodeを使用することができますLOCKINFOのオブジェクトが存在するオブジェクトThreadInfoにこれらのそれぞれに

ThreadMXBean bean = ManagementFactory.getThreadMXBean(); 
ThreadInfo[] ti = bean.getThreadInfo(bean.getAllThreadIds(), true, true); 

0

ロックを取るときに変数を使用して現在のスレッドを保持し、他の誰かがロックを使用しようとしている場合は、変数を使用して印刷できます。

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; 
    } 
} 
1

あなたは、そのオブジェクトのwait()またはnotify()メソッドを呼び出すことにより、特定のオブジェクトのロックを確認することができます。オブジェクトがロックを保持していない場合は、llegalMonitorStateExceptionがスローされます。

2- holdsLock(Object o)メソッドを呼び出してください。ブール値が返されます。

1

、それが現在のスレッドによって

final ReentrantLock lock = new ReentrantLock(); 
lock.isHeldByCurrentThread(); 
関連する問題