Java類鎖和物件鎖實踐

2021-08-27 19:31:11 字數 3915 閱讀 9928

一、前言

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不論被例項化多少次,其中的靜...