Java類鎖 物件鎖 私有鎖 隱式鎖

2021-08-07 11:53:22 字數 4417 閱讀 6058

類鎖物件鎖是否會衝突?物件鎖和私有鎖是否會衝突?通過例項來進行說明。

一、相關約定

為了明確後文的描述,先對本文涉及到的鎖的相關定義作如下約定:

1. 類鎖:在**中的方法上加了static和synchronized的鎖,或者synchronized(***.class)的**段,如下文中的increament();

2.物件鎖:在**中的方法上加了synchronized的鎖,或者synchronized(this)的**段,如下文中的synonmethod()和syninmethod();

3.私有鎖:在類內部宣告乙個私有屬性如private object lock,在需要加鎖的**段synchronized(lock),如下文中的synmethodwithobj()。

二、測試**

1.編寫乙個啟動類objectlock

public

class

objectlock}}

2.編寫乙個執行緒類objthread,用於啟動同步方法(注意它的run方法可能會調整以進行不同的測試)

public

class

objthread

extends

thread

public

void

run()

}

3.再編寫乙個鎖的測試類locktestclass,包括各種加鎖方法

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 

=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)都是對當前物件加鎖,二者的加鎖方法夠成了競爭關係,同一時刻只能有乙個方法能執行。   

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...