類鎖
和物件鎖
是否會衝突?物件鎖和私有鎖
是否會衝突?通過例項來進行說明。
一、相關約定
為了明確後文的描述,先對本文涉及到的鎖的相關定義作如下約定:
1. 類鎖:在**中的方法上加了static和synchronized的鎖,或者synchronized(***.class)的**段,如下文中的increament();
2.物件鎖:在**中的方法上加了synchronized的鎖,或者synchronized(this)的**段,如下文中的synonmethod()和syninmethod();
3.私有鎖:在類內部宣告乙個私有屬性如private object lock,在需要加鎖的**段synchronized(lock),如下文中的synmethodwithobj()。
二、測試**
1.編寫乙個啟動類objectlock
public2.編寫乙個執行緒類objthread,用於啟動同步方法(注意它的run方法可能會調整以進行不同的測試)class
objectlock}}
public3.再編寫乙個鎖的測試類locktestclass,包括各種加鎖方法class
objthread
extends
thread
public
void
run()
}
public三、測試結果class
locktestclass
/*** 物件鎖方法1
*/public
synchronized
void
synonmethod
()catch
(interruptedexceptione)
system
.out
.println
("synonmethod ends");}
/*** 物件鎖方法2,採用synchronized (this)來加鎖
*/public
void
syninmethod
()catch
(interruptedexceptione)
system
.out
.println
("syninmethod ends");}
}/**
* 物件鎖方法3
*/public
void
synmethodwithobj
()catch
(interruptedexceptione)
system
.out
.println
("synmethodwithobj ends");}
}/**
* 類鎖
*/public
static
synchronized
void
increament
()catch
(interruptedexceptione)
system
.out
.println
("class synchronized ends.");}
}
測試類鎖和物件鎖,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可以看到,二者嚴格地序列輸出(當然再次執行時先執行syninmethod還是先執行synonmethod並不是確定的,取決於誰獲得了鎖)。=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
結論:synchronized直接加在方法上和synchronized(this)都是對當前物件加鎖,二者的加鎖方法夠成了競爭關係,同一時刻只能有乙個方法能執行。
mysql隱式鎖 innodB的隱式鎖
一 知識準備之隱式鎖 innodb 實現了乙個延遲加鎖的機制,來減少加鎖的數量,在 中稱為隱式鎖 implicit lock 隱式鎖中有個重要的元素,事務id trx id 隱式鎖的邏輯過程如下 a.innodb的每條記錄中都乙個隱含的trx id欄位,這個字段存在於簇索引的b tree中。b.在操...
Java類鎖和物件鎖實踐
一 前言 1.類鎖 在 中的方法上加了static和synchronized的鎖,或者synchronized class 的 段,如下文中的increament 2.物件鎖 在 中的方法上加了synchronized的鎖,或者synchronized this 的 段,如下文中的synonmeth...
java的物件鎖和類鎖
類鎖 在 中的方法上加了static和synchronized的鎖,或者synchronized class 物件鎖 在 中的方法上加了synchronized的鎖,或者synchronized this 的 段 方法鎖和私有鎖 都屬於物件鎖 私有鎖 在類內部宣告乙個私有屬性如private obj...