2009-07-28 11 views
1

ひとつのスレッドがJavaの同期関数内で実行していて、別のスレッドが同じメソッドにアクセスしたいとしますが、最初のスレッドが完了するまで待たなければならないとしましょう。 2番目のスレッドは、どのスレッドがそのオブジェクトに対してロックを持っているかを知ることができます。 私は最初のスレッドの詳細を印刷したいかもしれません。おそらく、最初のスレッドが開始された場所から印刷したいと思います。オブジェクトのロックを持つスレッドの詳細を取得する方法

答えて

2

java.util.concurrent.locks.ReentrantLockを使用している場合、サブクラスはgetOwnerを呼び出すことができます。

また、JMXを使用することもできます。スレッドを繰り返して、java.lang.management.ThreadInfoと適切なgetLockedMonitors()またはgetLockedSynchronizers()を見つけてください。

0

私はそれができないと信じています。あなたには、いくつかの余分なコーディングで似たような行うことができますしかし:

public void myFunction() { 
    System.out.println("" + Thread.currentThread() + " entering sync @ myFunction"); 
    synchronized(this) { 
    System.out.println("" + Thread.currentThread() + " entered sync @ myFunction"); 

    ... 

    System.out.println("" + Thread.currentThread() + " leaving sync @ myFunction"); 
    } 
    System.out.println("" + Thread.currentThread() + " left sync @ myFunction"); 
} 
2

をそれはトムホーティンが書いたが、dumpAllThreadsでThreadInfoにを取得するときに、モニター情報を明示的に要求しなければならない、ほとんど何、少しトリッキーです。以下のような 何か:

Object lock = ... 
    ThreadMXBean mx = ManagementFactory.getThreadMXBean(); 
    ThreadInfo[] allInfo = mx.dumpAllThreads(true, false); 
    for (ThreadInfo threadInfo : allInfo) { 
     MonitorInfo[] monitors = threadInfo.getLockedMonitors(); 
     for (MonitorInfo monitorInfo : monitors) { 
      if (monitorInfo.getIdentityHashCode() == System.identityHashCode(lock)) { 
       StackTraceElement[] stackTrace = threadInfo.getStackTrace(); 
       // use the the Information from threadInfo 
      } 
     } 
    } 
1

は、診断目的のためにこれは、またはそれはあなたのアプリケーションの一部として使用したい機能のためです。それが診断のためのものであれば、ここでの他の回答のさまざまな冗長なロギングソリューションが、おそらくあなたを動かすのに十分です。機能の一部としてこれを実行する場合は、​​キーワードよりも堅牢で柔軟なものを使用するべきです(例えば、@ Tomで述べたReentrantLockウィザードなど)。

関連する問題