プログラムをJavaのスレッドしてロック
-
09-06-2019 - |
質問
できる実行時にプログラム名にチェックを入れているスレッドで開催中のロックの指定されたオブジェクト?
解決
できるだけるかどうか現在のスレッドに対して正常にロック(Thread.holdsLock(Object)
).ことはできませんへの参照を保持するスレッドのロックなネイティブコードです。
しかし、少なくともこの場を何もなネジ切りましょうたいを理解し、java.util.同パッケージ。の ReentrantLock
ができる、オーナーが保護された方法はまだ伸ばす。ご用途に応じて,その並行処理でパッケージだけでなく、ロックのオーナーです。
が非ート法、ロック所有者などのシグナル伝達のJVMの発行スレッドダンプをstderrは、有用な原因が何であるかの特定のデッドロック.
他のヒント
きのロックを有するスレッドとの反映である。このjava1.6.
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] ti = bean.getThreadInfo(bean.getAllThreadIds(), true, true);
それぞれのThreadInfoオブジェクトがLockInfoオブジェクトで利用できますidentityHashCodeし、それらと比較するとロック。
ですから、1.6、JMXいう興味深いことなどを見開催のロックを解除します。ことはできませんの実際のオブジェクトページをご覧の皆様へ取得しておくことをオススメのアイデンティティハッシュ値(みではありません).
走 jconsole.に含まれるドキュメンテーションシステムSDKとからョンをインストールして下さい。お使いいただくことによってOSを使用すが、windowsできるだけで、PIDのjavaプロセス。このスレッドを引き起こしている問題です。または、利用できるので、商用プロファイラのようにYourKitやその他何らかのプロファイラー.
1.5できるすべてのスレッドごとに取得しの状態、例えばこのように:
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
チェックできるロックは、特定のオブジェクトを呼び出し wait()
または notify()
メソッドをオブジェクトです。オブジェクトが次のどれかの場合は、ロックは、その投 llegalMonitorStateException
.
2-呼び出し holdsLock(Object o)
方法。このboolean値です。
であれば 再入学者のロック で確認できた場合で開催される現在のスレッド
final ReentrantLock lock = new ReentrantLock();
lock.isHeldByCurrentThread();
利用できる変数の現在のスレッドされている場合はロックで他の人が活動に活用しようとしています。
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;
}
}
醜いものです。
String findLockOwner(ReentrantLock lock) {
String patternStr = "\\[Locked by thread (\\S+)\\]";
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(lock.toString());
boolean matchFound = matcher.find();
if (matchFound && matcher.groupCount() >= 1) {
return matcher.group(1);
}
}