我想分析一個線程轉儲,它似乎表明有許多線程正在等待java.util.concurrent.Semaphore許可證,即線程正在Semaphore.acquire()上等待。如何查找當前擁有哪些線程java.util.concurrent.Semaphore允許?
這是我能夠暗示的,因爲線程處於WAITING(停放)狀態,並且從我所瞭解的信號量中不使用LOCK監視器,而是使用LockSupport.park()代替,等待另一個線程將其停止。
現在,有沒有辦法從什麼都線程當前持有的信號燈允許一個線程轉儲暗示?
在BLOCKED狀態的線程找到類似,並檢查哪個是保存這是造成線程阻塞鎖的線程?
當您獲得許可證時,沒有任何東西可以持有;當你釋放它時沒有什麼可以回報的。沒有任何線程實際上持有任何東西 - 它只是一個櫃檯。例如一個信號量可以從零許可開始,你可以合法地調用release。 –
@Andy Turner準確地說,我可以簡單地得出結論:不可能通過線程轉儲找到哪些線程已成功獲取許可證? – aathif
@aathif信號量不知道線程,這使得它們特別輕巧(並且在異步編程中非常有用)。一個線程可以釋放一個信號量而無需獲取它。沒有所有權的概念。你必須以艱難的方式去做,並分析堆棧跟蹤以找到他們正在等待的地方並從那裏開始。 – Voo