一、前言
1. 類鎖:在**中的方法上加了static和synchronized的鎖,或者synchronized(***.class)的**段,如下文中的increament();
2.物件鎖:在**中的方法上加了synchronized的鎖,或者synchronized(this)的**段,如下文中的synonmethod()和
syninmethod();
3.私有鎖:在類內部宣告乙個私有屬性如private object lock,在需要加鎖的**段synchronized(lock),如下文中的synmethodwithobj()。
二、測試**。
1.編寫乙個啟動類objectlock
package com.zjh.blog.practice.basic;
public class objectlock
}}
2.編寫乙個執行緒類objthread,用於啟動同步方法(注意它的run方法可能會調整以進行不同的測試)
package com.zjh.blog.practice.basic;
public class objthread extends thread
public void run()
}
3.再編寫乙個鎖的測試類locktestclass,包括各種加鎖方法
package com.zjh.blog.practice.basic;
public class locktestclass
/*** 物件鎖方法1
*/public synchronized void synonmethod() catch (interruptedexception e)
system.out.println("synonmethod ends");
} /**
* 物件鎖方法2,採用synchronized (this)來加鎖
*/public void syninmethod() catch (interruptedexception e)
system.out.println("syninmethod ends");
} }/**
* 物件鎖方法3
*/public void synmethodwithobj() catch (interruptedexception e)
system.out.println("synmethodwithobj ends");
} }/**
* 類鎖
*/public static synchronized void increament
() catch (interruptedexception e)
system.out.println("class synchronized ends.");
}}
三、測試結果
1.測試類鎖和物件鎖,objectthread的run方法修改如下:
public void run()
終端輸出如下:
start time = 1413101360231ms
syninmethod begins, time = 1413101360233ms
syninmethod ends
class synchronized. i = 0, time = 1413101362233ms
syninmethod begins, time = 1413101362233ms
class synchronized ends.
syninmethod ends
class synchronized. i = 1, time = 1413101364233ms
syninmethod begins, time = 1413101364233ms
class synchronized ends.
syninmethod ends
class synchronized. i = 2, time = 1413101366234ms
class synchronized ends.
可以看到物件鎖方法(syninmothod)第一次啟動時比類鎖方法(increament)快2秒,這是因為在syninmehtod執行時sleep了2秒再執行的increament,而這兩個方法共用乙個執行緒,所以會慢2秒,如果increament在run中放到syninmethod前面,那麼第一次啟動時就是increament快2秒。
而當類鎖方法啟動時,另乙個執行緒時的物件鎖方法也幾乎同時啟動,說明二者使用的並非同乙個鎖,不會產生競爭。
結論:類鎖和物件鎖不會產生競爭,二者的加鎖方法不會相互影響。
2.私有鎖和物件鎖,
objectthread的run方法修改如下:
public void run()
終端輸出如下:
start time = 1413121912406ms
syninmethod begins, time = 1413121912407ms.
syninmethod ends.
synmethodwithobj begins, time = 1413121914407ms
syninmethod begins, time = 1413121914407ms.
syninmethod ends.
synmethodwithobj ends
syninmethod begins, time = 1413121916407ms.
synmethodwithobj begins, time = 1413121916407ms
syninmethod ends.
synmethodwithobj ends
synmethodwithobj begins, time = 1413121918407ms
synmethodwithobj ends
和類鎖和物件鎖非常類似。
結論:私有鎖和物件鎖也不會產生競爭,二者的加鎖方法不會相互影響。
3.synchronized直接加在方法上和synchronized(this),objectthread的run方法修改如下:
public void run()
終端輸出:start time = 1413102913278ms
syninmethod begins, time = 1413102913279ms
syninmethod ends
syninmethod begins, time = 1413102915279ms
syninmethod ends
synonmethod begins, time = 1413102917279ms
synonmethod ends
syninmethod begins, time = 1413102919279ms
syninmethod ends
synonmethod begins, time = 1413102921279ms
synonmethod ends
synonmethod begins, time = 1413102923279ms
synonmethod ends
可以看到,二者嚴格地序列輸出(當然再次執行時先執行syninmethod還是先執行synonmethod並不是確定的,取決於誰獲得了鎖)
結論:synchronized直接加在方法上和synchronized(this)都是對當前物件加鎖,二者的加鎖方法夠成了競爭關係,同一時刻只能有乙個方法能執行。
四、參考:
java的物件鎖和類鎖
類鎖 在 中的方法上加了static和synchronized的鎖,或者synchronized class 物件鎖 在 中的方法上加了synchronized的鎖,或者synchronized this 的 段 方法鎖和私有鎖 都屬於物件鎖 私有鎖 在類內部宣告乙個私有屬性如private obj...
Java多執行緒 類鎖和物件鎖
我們設想某個執行緒獨佔某個類,必須執行完才能再次建立物件 預期輸出以下結果 物件鎖示例 關鍵字synchronized取得的鎖都是物件鎖,而不是把一段 方法 當做鎖,所以 中哪個執行緒先執行synchronized關鍵字的方法,哪個執行緒就持有該方法所屬物件的鎖 lock 在靜態方法上加synchr...
類鎖和物件鎖
物件鎖 當乙個物件中有synchronized method或synchronized block的時候呼叫此物件的同步方法或進入其同步區域時,就必須先獲得物件鎖。如果此物件的物件鎖已被其他呼叫者占用,則需要等待此鎖被釋放 同步靜態方法 靜態變數互斥體 由於乙個class不論被例項化多少次,其中的靜...