1. 程式人生 > >[java基礎]一文理解java多執行緒必備的ychronized關鍵字,從此不再混淆!

[java基礎]一文理解java多執行緒必備的ychronized關鍵字,從此不再混淆!

java併發程式設計中最長用到的關鍵字就是synchronized了,這裡講解一下這個關鍵字的用法和容易混淆的地方. synchronized關鍵字涉及到鎖的概念, 在java中,synchronized鎖大家又通俗的稱為:方法鎖,物件鎖 和 類鎖 三種.

先上結論!

1 無論是修飾方法還是修飾程式碼塊都是 物件鎖,當一個執行緒訪問一個帶synchronized方法時,由於物件鎖的存在,所有加synchronized的方法都不能被訪問(前提是在多個執行緒呼叫的是同一個物件例項中的方法) 2 無論是修飾靜態方法還是鎖定某個物件,都是 類鎖.一個class其中的靜態方法和靜態變數在記憶體中只會載入和初始化一份,所以,一旦一個靜態的方法被申明為synchronized

,此類的所有的例項化物件在呼叫該方法時,共用同一把鎖,稱之為類鎖。

1 物件鎖的寫法一: 修飾方法:

synchronized修飾普通方法,鎖定的是當前物件.一次只能有一個執行緒進入同一個物件例項method()方法. 寫法如下:

2 物件鎖的寫法二:修飾程式碼塊,鎖例項物件

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

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

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

3 synchronized同時修飾靜態和非靜態方法

上面的synchronized同時修飾靜態方法和例項方法,結果交替執行,證明類鎖和物件鎖是兩個不同的鎖,控制不同的區域,互不干擾.

Tips:

1.synchronized關鍵字不能繼承。也就是說子類重寫了父類中用synchronized修飾的方法,子類的方法仍然不是同步的。

2.定義介面方法時,不能使用synchronized關鍵字。

3.構造方法不能使用synchronized關鍵字,但是可以使用synchronized程式碼塊。