Lock與synchronized的區別

2021-08-10 17:49:46 字數 1723 閱讀 5416

對比項

synchronized

lock 時間

早期jdk版本中就提供的同步機制

jdk5以後的版本中提供的同步機制

釋放鎖jvm層面實現的,同步**執行

完後自動釋放鎖

**實現的,需要手動呼叫

unlock方法釋放鎖,最好在finally中

釋放鎖

讀寫鎖

不區分讀寫鎖

提供讀鎖和寫鎖,多讀少寫的情況

時有更高的效率

鎖判斷無法判斷

可判斷鎖型別

可重入、不可中斷、非公平

可重入,可中斷,可公平(兩者皆可) 效能

少量同步

大量同步

lock的公平鎖與非公平鎖:

公平鎖(fairsync):直接將獲取鎖的操作放到等待佇列中,誰先搶到鎖誰先執行。

非公平鎖(nofairsync): 先獲取鎖,獲取到則執行,未獲取到則放入等待佇列。

因為從執行緒進入了

runnable狀態,可以執行開始,到實際執行緒執行是要比較久的時間的。而且,在乙個鎖釋放之後,其他的執行緒會需要重新來獲取鎖。其中經歷了持有鎖的執行緒釋放鎖,其他執行緒從掛起恢復到

runnable狀態,其他執行緒請求鎖,獲得鎖,執行緒執行,這一系列步驟。如果這個時候,存在乙個執行緒直接請求鎖,可能就避開掛起到恢復

runnable狀態的這段消耗,所以效能更優化。

reentrantlock()預設使用的非公平鎖。

lock的讀寫鎖

讀讀操作非互斥,讀寫操作互斥,寫讀操作互斥,寫寫操作互斥,讀寫鎖提高了讀多寫少案例的併發效能。

讀寫鎖實現高效快取:

/**

* 使用lock的讀寫鎖實現高效快取,使用單例模式實現快取物件的唯一性

* @author zsc

* @datetime 2023年11月13日 下午3:27:26

*/public class cache implements serializable

/*** 單例模式,獲取快取物件

* @return

*/public static cache getinstance()

}} return instance;

} /**

* 根據key查詢快取

* @param key

* @return

*/public object get(string key) catch (exception e) finally

return null;

} /**

* 設定快取

* @param key

* @param value

*/public void set(string key, string value) catch (exception e) finally

} /**

* 移除指定key的快取,預設返回被移除的value,key不存在則返回null

* @param key

* @return

*/public object remove(string key) catch (exception e) finally

return null; }

/*** 清除所有快取

*/public void clear() catch (exception e) finally

}}

Java執行緒同步問題synchronized

android usb 讀寫以前都是一讀一寫,但有些機器會出問題。就採用讀寫非同步的方法。使用物件鎖,object自帶的,然後使用object的方法wait和notify notifyall 使用方法簡單,記錄下 public synchronized int lra setregister int...

Java學習之執行緒鎖 synchronized

同步 併發 多個執行緒訪問同乙份資源 確保資源安全 執行緒安全 synchronized 同步 1 同步塊 synchronized 引用型別 this 類.class 2 同步方法 public synchronized void test public class testsyn class t...

Lock(遞迴函式與死鎖)

看看以下會不會產生死鎖 public class a else class program 你的答案是會產生死鎖嗎?可以理解,因為也許你以前一直以為外層遞迴被鎖住後,不允許在訪問裡邊的 快,而由於遞迴,有需要等待外層遞迴解鎖,所以由此造成死鎖,現在才知道這種理解是錯誤的 結果是永遠不會出現死鎖,因為...