讓我們假設一個線程在Java中的同步函數中執行,而另一個線程想要訪問相同的方法,但它必須等到第一個線程完成。 第二個線程如何知道哪個線程在對象上具有鎖定。 我想打印第一個線程的細節,可能從第一個線程的啓動位置開始。如何獲取線程鎖定對象的詳細信息
1
A
回答
2
如果您使用的是java.util.concurrent.locks.ReentrantLock
,那麼子類可以調用getOwner
。
或者,您可以使用JMX。迭代通過線程找到適當的getLockedMonitors()
或getLockedSynchronizers()
的java.lang.management.ThreadInfo
。
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
這是一個有點棘手,幾乎什麼湯姆Hawtin寫的,但在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
wizardry。
相關問題
- 1. CA拉力賽 - 如何獲取子對象的詳細信息,如從ProjectPermission獲得項目詳細信息
- 2. 從ActivatedRouteSnapshot獲取路線詳細信息
- 3. C#獲取過程的詳細信息
- 4. 獲取Facebook詳細信息
- 5. 如何獲取異常詳細信息
- 6. 如何在MKMapview中獲取路線方向的詳細信息
- 7. 如何獲得引用對象的詳細信息
- 8. 從windbg中的clrstack輸出獲取對象詳細信息
- 9. 訪問JSON對象的詳細信息
- 10. 如何獲取用戶的特定帖子的詳細信息?
- 11. Android主詳細信息詳細信息
- 12. Crystal Reports詳細信息詳細信息
- 13. 從H2O模型對象獲取模型詳細信息
- 14. 獲取額外的PaperSource詳細信息
- 15. 如何從php獲取單一級別的對象詳細信息?
- 16. 如何在重定向時獲取表格行詳細信息
- 17. 獲取DataGrid行詳細信息
- 18. Databasemetadata獲取列詳細信息
- 19. SPNEGO獲取用戶詳細信息
- 20. 從log.nsf獲取用戶詳細信息
- 21. LINQ:獲取表詳細信息
- 22. 從MGTwitterEngine獲取用戶詳細信息
- 23. Foursquare獲取場地詳細信息
- 24. 獲取最後登錄詳細信息
- 25. 從照片中獲取詳細信息
- 26. 從貝寶獲取詳細信息?
- 27. ActiveDirectoryLdapAuthenticationProvider:獲取用戶詳細信息
- 28. 獲取API詳細信息到console.log
- 29. C#從子類獲取詳細信息
- 30. Get-ADGroupMember獲取用戶詳細信息?