之前在寫代碼的時候,如果需要讓線程等待一會,就直接使用sleep()方法,一直也沒有出過問題。而wait()方法的出場率很高,每次打一個句點的時候,對象的方法彈出來,總是能看到wait()在其中,wait()是一個Object對象中為數不多的方法之一,開始在嘗試使用wait()方法的時候總是出錯,感覺這個方法很麻煩,但是一直也沒有研究這是一個什么樣的方法。
最近在研究java同步機制,才知道每個對象中都唯一一個對象鎖的東西,這個對象鎖的設置就是為了實現傳統PV鎖的功能。wait()字面上的意思是等待,意思就是等待對象的對象鎖。相對應的,notify()方法就是釋放對象的對象鎖,然后由OS來分配給在等待對象鎖的兄弟們,wait()和notify()方法都要在synchronized代碼塊中使用。
總的來說,wait()方法有sleep()有類似的地方,都是延遲一個方法的運行,但是sleep()一般來說都會設置一個時間參數,或者等待一個interupt()來隨時叫醒。而且sleep()方法就是單純的釋放占有CPU的權利,睡起來后再繼續工作,沒有對對象鎖的操作。sleep()還有個很神奇的地方,就是在哪個類中調用sleep()方法,誰就去睡覺。即使在A類中調用B.sleep(1000)方法,也是A去睡覺。
wait()方法一般不設置時間參數,而是等待另一個方法執行完后釋放對象鎖出來后再開始執行,用對象鎖保持一個方法執行的順序關系,也維護了每次一個方法訪問共有變量。巧妙的使用wait()能夠輕易的實現很多多線程問題,然而使用不好也很容易造成死鎖的問題。