1. 程式人生 > >java synchronized關鍵字的用法以及鎖的等級:方法鎖、物件鎖、類鎖

java synchronized關鍵字的用法以及鎖的等級:方法鎖、物件鎖、類鎖

轉載自:http://blog.csdn.net/le_le_name/article/details/52348314

java的內建鎖:每個java物件都可以用做一個實現同步的鎖,這些鎖成為內建鎖。執行緒進入同步程式碼塊或方法的時候會自動獲得該鎖,在退出同步程式碼塊或方法時會釋放該鎖。獲得內建鎖的唯一途徑就是進入這個鎖的保護的同步程式碼塊或方法。

java內建鎖是一個互斥鎖,這就是意味著最多隻有一個執行緒能夠獲得該鎖,當執行緒A嘗試去獲得執行緒B持有的內建鎖時,執行緒A必須等待或者阻塞,知道執行緒B釋放這個鎖,如果B執行緒不釋放這個鎖,那麼A執行緒將永遠等待下去。

java的物件鎖和類鎖:java的物件鎖和類鎖在鎖的概念上基本上和內建鎖是一致的,但是,兩個鎖實際是有很大的區別的,物件鎖是用於物件例項方法,或者一個物件例項上的,類鎖是用於類的靜態方法或者一個類的class物件上的。我們知道,類的物件例項可以有很多個,但是每個類只有一個class物件,所以不同物件例項的物件鎖是互不干擾的,但是每個類只有一個類鎖。但是有一點必須注意的是,其實類鎖只是一個概念上的東西,並不是真實存在的,它只是用來幫助我們理解鎖定例項方法和靜態方法的區別的

上面已經對鎖的一些概念有了一點了解,下面探討synchronized關鍵字的用法。

synchronized的用法:synchronized修飾方法和synchronized修飾程式碼塊。

其實,類鎖修飾方法和程式碼塊的效果和物件鎖是一樣的,因為類鎖只是一個抽象出來的概念,只是為了區別靜態方法的特點,因為靜態方法是所有物件例項共用的,所以對應著synchronized修飾的靜態方法的鎖也是唯一的,所以抽象出來個類鎖。其實這裡的重點在下面這塊程式碼,synchronized同時修飾靜態和非靜態方法

synchronized的缺陷:當某個執行緒進入同步方法獲得物件鎖,那麼其他執行緒訪問這裡物件的同步方法時,必須等待或者阻塞,這對高併發的系統是致命的,這很容易導致系統的崩潰。如果某個執行緒在同步方法裡面發生了死迴圈,那麼它就永遠不會釋放這個物件鎖,那麼其他執行緒就要永遠的等待。這是一個致命的問題。


一個類的物件鎖和另一個類的物件鎖是沒有關聯的,當一個執行緒獲得A類的物件鎖時,它同時也可以獲得B類的物件鎖。



相關推薦

no