這篇文章帶給大家的內容是關於synchronized使用的四個方法介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
1.修飾一個方法
synchronized 修飾一個方法很簡單,就是在方法的前面加上synchronized,例如:
public synchronized void method() { // todo }
在定義介面方法時不能使用synchronized關鍵字。
建構方法不能使用synchronized關鍵字,但可以使用synchronized程式碼區塊來進行同步。
synchronized 關鍵字不能被繼承 ,如果要同步需要明確的加上關鍵字。
synchronized 關鍵字修飾的方法如果被重寫預設不同步,如果要同步需要明確的加上關鍵字,或是super父類別的方法也就等於同步了。
2.修飾程式碼區塊
public void method() { synchronized(this) synchronized(XX.class) }
synchronized(this)鎖的是當前對象,當前有幾個對像那麼這個this就是有多份,這裡的this只能鎖同一個物件。
synchronized(XX.class)只要是這個類型的class這把鎖就都有用
#當兩個並發線程訪問同一個物件object中的這個synchronized(this)同步程式碼區塊時,一個時間內只能有一個執行緒執行。另一個執行緒必須等待目前執行緒執行完這個程式碼區塊以後才能執行該程式碼區塊。當一個執行緒存取object的一個synchronized(this)同步程式碼區塊時,另一個執行緒仍然可以存取該object中的非synchronized(this)同步程式碼區塊。特別關鍵的是,當一個執行緒存取object的一個synchronized(this)同步程式碼區塊時,其他執行緒對object中所有其它synchronized(this)同步程式碼區塊的存取將被阻塞。
第三個例子同樣適用其它同步程式碼區塊。也就是說,當一個執行緒存取object的一個synchronized(this)同步程式碼區塊時,它就獲得了這個object的物件鎖定。結果,其它執行緒對該object物件所有同步程式碼部分的存取都被暫時阻塞。
以上規則對其它物件鎖定同樣適用.
3.修飾靜態方法
#我們知道 靜態方法是屬於類別的而不屬於物件的 。同樣的, synchronized修飾的靜態方法鎖定的是這個類別的所有對象,所有類別用它都會有鎖的效果
public synchronized static void method() { // todo }
4.修飾一個類別
其作用的範圍是synchronized後面括號括起來的部分,作用的對象就是這個類別的所有對象,只要是這個類型的class不管有幾個對像都會運作。如下程式碼
class ClassName { public void method() { synchronized(ClassName.class) { // todo } } }
A. 無論synchronized關鍵字加在方法上還是物件上,如果它作用的物件是非靜態的,則它取得的鎖定是物件;如果synchronized作用的物件是一個靜態方法或一個類,則它所取得的鎖是對類,該類別所有的物件同一把鎖。
B. 每個物件只有一個鎖(lock)與之相關聯,誰拿到這個鎖誰就可以運行它所控制的那段程式碼。
C. 實現同步是要很大的系統開銷作為代價的,甚至可能造成死鎖,所以盡量避免無謂的同步控制。
D.同步關鍵字鎖定的是物件
以上是synchronized所使用的四個方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!