[java基礎]一文理解java多執行緒必備的sychronized關鍵字,從此不再混淆!
java併發程式設計中最長用到的關鍵字就是synchronized
了,這裡講解一下這個關鍵字的用法和容易混淆的地方.synchronized
關鍵字涉及到鎖的概念, 在java中,synchronized鎖大家又通俗的稱為:方法鎖,物件鎖 和 類鎖 三種.
先上結論!
1 無論是修飾方法還是修飾程式碼塊都是 物件鎖,當一個執行緒訪問一個帶synchronized
方法時,由於物件鎖的存在,所有加synchronized
的方法都不能被訪問(前提是在多個執行緒呼叫的是同一個物件例項中的方法)
2 無論是修飾靜態方法還是鎖定某個物件,都是 類鎖.一個class其中的靜態方法和靜態變數在記憶體中只會載入和初始化一份,所以,一旦一個靜態的方法被申明為synchronized
1 物件鎖的寫法一: 修飾方法:
synchronized
修飾普通方法,鎖定的是當前物件.一次只能有一個執行緒進入同一個物件例項的method()
方法.
寫法如下:
2 物件鎖的寫法二:修飾程式碼塊,鎖例項物件

3 類鎖的寫法一:修飾靜態方法

4 類鎖的寫法二:修飾程式碼塊,鎖類物件

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

上面的synchronized
同時修飾靜態方法和例項方法,結果交替執行,證明類鎖和物件鎖是兩個不同的鎖,控制不同的區域,互不干擾.
Tips:
1.synchronized
關鍵字不能繼承。也就是說子類重寫了父類中用synchronized
修飾的方法,子類的方法仍然不是同步的。
2.定義介面方法時,不能使用synchronized
關鍵字。
3.構造方法不能使用synchronized
關鍵字,但是可以使用synchronized
程式碼塊。
程式設計師燈塔(code12306):分享面試攻略+技術乾貨