2016-02-02 24 views
1

我想分析一個線程轉儲,它似乎表明有許多線程正在等待java.util.concurrent.Semaphore許可證,即線程正在Semaphore.acquire()上等待。如何查找當前擁有哪些線程java.util.concurrent.Semaphore允許?

這是我能夠暗示的,因爲線程處於WAITING(停放)狀態,並且從我所瞭解的信號量中不使用LOCK監視器,而是使用LockSupport.park()代替,等待另一個線程將其停止。

現在,有沒有辦法從什麼都線程當前持有的信號燈允許一個線程轉儲暗示?

在BLOCKED狀態的線程找到類似,並檢查哪個是保存這是造成線程阻塞鎖的線程?

+4

當您獲得許可證時,沒有任何東西可以持有;當你釋放它時沒有什麼可以回報的。沒有任何線程實際上持有任何東西 - 它只是一個櫃檯。例如一個信號量可以從零許可開始,你可以合法地調用release。 –

+0

@Andy Turner準確地說,我可以簡單地得出結論:不可能通過線程轉儲找到哪些線程已成功獲取許可證? – aathif

+1

@aathif信號量不知道線程,這使得它們特別輕巧(並且在異步編程中非常有用)。一個線程可以釋放一個信號量而無需獲取它。沒有所有權的概念。你必須以艱難的方式去做,並分析堆棧跟蹤以找到他們正在等待的地方並從那裏開始。 – Voo

回答

2

信號燈不具有所有權的概念或瞭解線程什麼。這使得它們特別輕巧(並且在異步編程中非常有用,其中邏輯執行線程及其執行的硬件線程不一定具有1:1映射)。

你也可以從線程可以釋放一個信號而沒有獲取它的事實中看到這一點。

你將不得不看的蹤跡,看看哪些信號量的線程都在等待,並從那裏向後工作。

1

有工具,幫助您分析dumps.Yourkit就是這樣一個工具,可以用來分析阻塞的線程。

參考: https://www.yourkit.com/docs/java/help/monitor_profiling.jsp

+0

我知道這樣的線程轉儲分析器。如果你能寫關於YourKit如何幫助我找出哪些線程信號量允許導致爭用,那將是非常好的。 – aathif

+0

Yourkit可用於分析線程以及監視器。 在Yourkit中你會發現一個線程標籤可以讓你查看所有線程的狀態(等待,阻塞等)。它還會告訴你它是否是一個守護線程以及更多。 用於查看顯示器使用情況詳情 在Yourkit中查看 - >顯示器使用情況。但不確定如果你能得到信號量許可的細節。 – Sneha

相關問題