在Java中,一個線程可以進入休眠狀態,這樣它就不會佔用進程,而其他線程可以獲得運行的機會。這是通過調用sleep()完成的。在Java中,其他線程如何在sleep()上調用當前線程後仍有機會運行,但仍然保持鎖定狀態?
但是,與調用wait()不同,線程在調用sleep()之後,將會釋放它持有的鎖。由於這個線程仍然持有鎖,其他線程如何獲得運行機會而不能獲取未釋放的鎖?
在Java中,一個線程可以進入休眠狀態,這樣它就不會佔用進程,而其他線程可以獲得運行的機會。這是通過調用sleep()完成的。在Java中,其他線程如何在sleep()上調用當前線程後仍有機會運行,但仍然保持鎖定狀態?
但是,與調用wait()不同,線程在調用sleep()之後,將會釋放它持有的鎖。由於這個線程仍然持有鎖,其他線程如何獲得運行機會而不能獲取未釋放的鎖?
他們不能;其他需要獲取睡眠線程所擁有的鎖的線程將阻塞,直到它們能夠獲得它爲止。沒有辦法在明確的鎖定上像tryacquire一樣退出,所以線程被卡住了。
線程不應該睡着的時候拿着鎖。如果一個線程沒有做一些有用的事情,它不需要持有一個鎖。
要進入休眠狀態並釋放鎖,請使用等待方法。睡眠沒有任何方法可以將睡眠時間縮短而不是中斷(應該用於取消),等待讓線程得到通知。
如果您在持有鎖或從塊/方法內調用Thread.sleep()
時,到達該鎖的任何其他線程將等待,直到第一個線程恢復並釋放該鎖。
但是,鎖定/同步不是全局的,任何沒有到達睡眠線程保持的鎖的線程都可以正常運行。
如果其他線程在該線程休眠時無法獲得鎖運行,那麼該線程首先要睡覺的目的是什麼?
唯一能夠回答該問題的人是編寫在線程中運行的代碼的人。
是你嗎?
彌敦道休斯說,它幾乎從來都是一個線程sleep()
一個好主意,在持有互斥鎖。爲了進一步理解這個想法:對於線程來說,幾乎從不是一個好主意,任何東西在持有互斥鎖的同時需要超過一微秒左右的時間。如果您發現自己編寫的代碼在鎖定鎖的同時等待某些內容,那麼這意味着您可能需要重新考慮架構。
此外,調用sleep()根本沒有多少好理由。
在Java中,一個線程可以進入休眠狀態,以便它不會佔用進程,而其他線程可以獲得運行的機會。
這不是真正的睡眠()是什麼。在大多數情況下,當線程不需要CPU時,它將在wait()
調用或某個xyz.await()
調用中(其中xyz
是隊列或信號量或鎖存器或某個其他更高級別的同步對象)阻塞。
sleep()函數是一個底層的原語,程序可以調用它來滿足實時要求。但大多數具有實時要求的程序可以使用更高級別的設施,如java.util.concurrent.ScheduledThreadPoolExecutor
或javax.swing.Timer
。如果你首先編寫你自己的sleep()調用,而不先調查更高級別的對象,那麼你可能正在重新發明一個輪子。
如果它們不需要睡眠線程所擁有的鎖,它們可以運行。如果他們需要他們,他們需要等待另一個線程喚醒並解鎖它們 – litelite
這很含糊,你有具體的例子嗎? – dimo414
感謝您的人們的快速回復。是的,我正在談論一個在調用sleep()時已經鎖定了鎖的線程。對於其他線程,我的意思是那些試圖獲得相同鎖的線程。如果其他線程無法在該線程進入睡眠狀態時運行該鎖,那麼該線程在第一時間睡覺的目的是什麼?當然,對於那些希望鎖定不同鎖的其他線程來說,這並不重要。 – user2142271