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 修飾靜態...