synchronized的四種用法

2022-09-16 15:18:11 字數 1726 閱讀 1341

synchronized修飾乙個方法很簡單,就是在方法的前面加synchronized,synchronized修飾方法和修飾乙個**塊類似,只是作用範圍不一樣,修飾**塊是大括號括起來的範圍,而修飾方法範圍是整個函式

例如:方法一

public synchronized void method()
方法二

public void method()

}

寫法一修飾的是乙個方法,寫法二修飾的是乙個**塊,但寫法一與寫法二是等價的,都是鎖定了整個方法時的內容。

synchronized關鍵字不能繼承。 

雖然可以使用synchronized來定義方法,但synchronized並不屬於方法定義的一部分,因此,synchronized關鍵字不能被繼承。

如果在父類中的某個方法使用了synchronized關鍵字,而在子類中覆蓋了這個方法,在子類中的這個方法預設情況下並不是同步的,而必須顯式地在子類的這個方法中加上synchronized關鍵字才可以。

當然,還可以在子類方法中呼叫父類中相應的方法,這樣雖然子類中的方法不是同步的,但子類呼叫了父類的同步方法,因此,子類的方法也就相當於同步了。這兩種方式的例子**如下:

在子類方法中加上synchronized關鍵字

class parent 

}class child extends parent

}

在子類方法中呼叫父類的同步方法

class parent 

}class child extends parent

}

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

構造方法不能使用synchronized關鍵字,但可以使用synchronized**塊來進行同步。

1)乙個執行緒訪問乙個物件中的synchronized(this)同步**塊時,其他試圖訪問該物件的執行緒將被阻塞

2)當乙個執行緒訪問物件的乙個synchronized(this)同步**塊時,另乙個執行緒仍然可以訪問該物件中的非synchronized(this)同步**塊。

3)指定要給某個物件加鎖

當有乙個明確的物件作為鎖時,就可以用類似下面這樣的方式寫程式。

public void method3(someobject obj)

}

synchronized也可修飾乙個靜態方法,用法如下:

public synchronized static void method()
靜態方法是屬於類的而不屬於物件的。同樣的,synchronized修飾的靜態方法鎖定的是這個類的所有物件。

synchronized還可作用於乙個類,用法如下:

class classname 

}}

本例的的給class加鎖和上例的給靜態方法加鎖是一樣的,所有物件公用一把鎖

a. 無論synchronized關鍵字加在方法上還是物件上,如果它作用的物件是非靜態的,則它取得的鎖是物件;如果synchronized作用的物件是乙個靜態方法或乙個類,則它取得的鎖是對類,該類所有的物件同一把鎖。 

b. 每個物件只有乙個鎖(lock)與之相關聯,誰拿到這個鎖誰就可以執行它所控制的那段**。 

c. 實現同步是要很大的系統開銷作為代價的,甚至可能造成死鎖,所以盡量避免無謂的同步控制。

synchronized的四種用法

一 修飾方法 synchronized修飾乙個方法很簡單,就是在方法的前面加synchronized,synchronized修飾方法和修飾乙個 塊類似,只是作用範圍不一樣,修飾 塊是大括號括起來的範圍,而修飾方法範圍是整個函式。例如 方法一 public synchronized void met...

synchronized的四種用法

1.方法宣告時使用,放在範圍操作符 public等 之後,返回型別宣告 void等 之前.即一次只能有乙個執行緒進入該方法,其他執行緒要想在此時呼叫該方法,只能排隊等候,當前執行緒 就是在synchronized方法內部的執行緒 執行完該方法後,別的執行緒才能進入.2.對某一 塊使用,synchro...

原子性 synchronized 修飾的四種方式

原子性 synchronized 依賴jvm 1 修飾 塊 大括號括起來的 作用於 呼叫的物件 比如 public void test1 int j j,i 2 修飾方法 整個方法,作用於 呼叫的物件 比如 修飾乙個方法 public synchronized void test2 i 3 修飾靜態...