對比項
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 你的答案是會產生死鎖嗎?可以理解,因為也許你以前一直以為外層遞迴被鎖住後,不允許在訪問裡邊的 快,而由於遞迴,有需要等待外層遞迴解鎖,所以由此造成死鎖,現在才知道這種理解是錯誤的 結果是永遠不會出現死鎖,因為...