1. 程式人生 > >java多執行緒之(二)鎖

java多執行緒之(二)鎖

一,鎖

在物件的建立時java會為每個object物件分配一個monitor( 監視器或者監視鎖),當某個物件的同步方法(synchronized methods )被多個執行緒呼叫時,該物件的monitor將負責處理這些訪問的併發獨佔要求。
當一個執行緒呼叫一個物件的同步方法時(synchronized ),JVM會檢查該物件的monitor。如果monitor沒有被佔用,那麼這個執行緒就得到了monitor的佔有權,可以繼續執行該物件的同步方法;如果monitor被其他執行緒所佔用,那麼該執行緒將被掛起,直到monitor被釋放。
當執行緒退出同步方法呼叫時,該執行緒會釋放monitor,這將允許其他等待的執行緒獲得monitor以使對同步方法的呼叫執行下去。
注意:Java物件的monitor機制和傳統的臨界檢查程式碼區技術不一樣。java的一個同步方法並不意味著同時只有一個執行緒獨佔執行,但臨界檢查程式碼區技術確實會保證同步方法在一個時刻只被一個執行緒獨佔執行。Java的monitor機制的準確含義是:任何時刻,對一個指定object物件的某同步方法只能由一個執行緒來呼叫。
java物件的monitor是跟隨object例項來使用的,而不是跟隨程式程式碼。兩個執行緒可以同時執行相同的同步方法,比如:一個類的同步方法是xMethod(),有a,b兩個物件例項,一個執行緒執行a.xMethod(),另一個執行緒執行b.xMethod(). 互不衝突,原因就是因為使用的是物件鎖(方法鎖屬於物件鎖)並非類鎖,而a和b是兩個例項物件。

二,同步鎖和互斥鎖

互斥鎖,是所有的執行緒共同來爭奪資源實現對資源的獨佔,執行沒有順序,誰搶到誰執行,搶不到就繼續競爭。

同步鎖,是多個執行緒按照一定的約定好的順序執行,他們互相之間知道對方的存在,彼此之間起著相互合作的關係。

三,死鎖

死鎖是因為兩個或者兩個以上的執行緒在對公共資源的爭奪競爭過程中出現的一種阻塞現象,如果沒有外力的作用這種現象將會持續下去。

死鎖產生的條件:

(1) 互斥條件:一個資源每次只能被一個程序使用。
(2) 請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。