Java併發編程-加鎖機制

要保持狀態的一致性,需要在單個原子操作中更新所有的相關的狀態變量。

內置鎖:通過內置鎖來支持原子性,同步代碼塊(Synchronized Block)包括兩個部分(1)鎖的對象引用(2)鎖保護的代碼塊

synchronized(lock){

}

靜態的synchronized方法以Class對象作爲鎖。每個java對象都可以做一個實現同步的鎖,這些鎖成爲內置鎖或監視器鎖。現場在進入同步代碼塊之前會自動獲得鎖,並在執行完退出代碼塊之後,無論是正常執行完,還是拋異常退出,都會施放鎖。獲得內置鎖的唯一途徑就是進入同步代碼塊。

內置鎖相當於一個互斥體,這就意味着只有一個線程能持有這個鎖。因此這個同步代碼塊將以原子的方式執行,其他現場不會干擾到同步代碼塊中執行。其他線程在試圖獲得已經正在有線程執行的內置鎖的時候,這個線程將等待進入阻塞狀態。

內置鎖的重入

重入故名思意就是,當線程獲得了內置鎖,在次進入的時候,會直接進入,而不需要再次獲得內置鎖。在子類繼承父類的同步方法的時候,子類會調用父類的方法。子類對象在調用重新的父類對象方法的時候,得到的都是同一個實例對象的鎖,如果鎖不是可以重入的,在第二次調用,也就是在調用父類方法的時候,也會試圖得到該對象的鎖,將會一直被阻塞,將發生死鎖。而鎖的可以重入的,就避免了死鎖。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章