多線程中的wait與sleep到底誰釋放了鎖


首先,多線程中會使用到兩個延遲的函數,wait和sleep。

wait是Object類中的方法,而sleep是Thread類中的方法。

 

sleep是Thread類中的靜態方法。無論是在a線程中調用b的sleep方法,還是b線程中調用a的sleep方法,誰調用,誰睡覺。

 

最主要的是sleep方法調用之后,並沒有釋放鎖。使得線程仍然可以同步控制。sleep不會讓出系統資源;

而wait是進入線程等待池中等待,讓出系統資源。

 

調用wait方法的線程,不會自己喚醒,需要線程調用 notify / notifyAll 方法喚醒等待池中的所有線程,才會進入就緒隊列中等待系統分配資源。sleep方法會自動喚醒,如果時間不到,想要喚醒,可以使用interrupt方法強行打斷。

Thread.sleep(0) // 觸發操作系統立刻重新進行一次CPU競爭。

 

使用范圍:

sleep可以在任何地方使用。而wait,notify,notifyAll只能在同步控制方法或者同步控制塊中使用。

 

sleep必須捕獲異常,而wait,notify,notifyAll的不需要捕獲異常。

 

lock關鍵字可以用來確保代碼塊完成運行,而不會被其他線程中斷。它可以把一段代碼定義為互斥段(critical section),互斥段在一個時刻內只允許一個線程進入執行,而其他線程必須等待。這是通過在代碼塊運行期間為給定對象獲取互斥鎖來實現的。例如下面增加任務時候就要用上lock函數。

public void AddTask(List<DataHour> datas) {
            if (datas != null && datas.Count > 0) {
                lock (_taskQueueLock) {
                    for (int i = 0; i < datas.Count; i++) {
                        datas[i].Iaqi = GetIaqi(datas[i]);
                    }
                    _taskQueue.Enqueue(datas);
                }
            }
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM