鎖的優化以下:
1.使用無鎖方案
2.避免死鎖
3.減少鎖持有時間
4.鎖分離
5.鎖粗化
6.減少鎖粒度前端
無鎖方案單獨介紹,避免死鎖可參考:Java併發編程入門(九)死鎖和死鎖定位。java
只對有同步須要的代碼塊作同步處理,而不必定要對整個方法作同步,例如單例模式的二次檢查。編程
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (null == singleton) {
//減少鎖持有時間,而不是把synchronized關鍵字放在方法上
synchronized (Singleton.class) {
if (null == singleton) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
複製代碼
1.對於讀多寫少的數據能夠分離讀寫鎖,讀讀不互斥,讀寫互斥,寫寫互斥,這樣在讀讀時能提升效率。
2.對於鏈表數據結構,若是取數據是作前端獲取,放入數據是從尾端獲取,那麼能夠將取數據和放數據的鎖分離,參考LinkedBlockingQueue。緩存
獲取鎖操做會消耗資源,若是一個操做須要頻繁的獲取鎖,而獲取鎖操做以後的操做很快就能完成,那麼能夠將獲取鎖操做合併。例如在循環語句中獲取同一個鎖,能夠將獲取鎖操做放到循環外。安全
for (int i = 0; i < size; i++) {
synchronized(lock) {
//do something
}
}
複製代碼
減少鎖粒度通常用於容器類,例如經過map來緩存數據,每一個key是一類數據,如證件類型,客戶類型等等,這樣在對map操做時能夠將鎖分離到每個key上,在操做某一種類型的數據時,對key加鎖。
Java中的ConcurrentHashMap類內部分紅了16個段,每一個段都有本身的鎖,這樣最大能夠有16個併發操做,也是經過減少鎖粒度提升了效率。數據結構
end.併發
相關閱讀:
Java併發編程(一)知識地圖
Java併發編程(二)原子性
Java併發編程(三)可見性
Java併發編程(四)有序性
Java併發編程(五)建立線程方式概覽
Java併發編程入門(六)synchronized用法
Java併發編程入門(七)輕鬆理解wait和notify以及使用場景
Java併發編程入門(八)線程生命週期
Java併發編程入門(九)死鎖和死鎖定位
Java併發編程入門(十一)限流場景和Spring限流器實現
Java併發編程入門(十二)生產者和消費者模式-代碼模板
Java併發編程入門(十三)讀寫鎖和緩存模板
Java併發編程入門(十四)CountDownLatch應用場景
Java併發編程入門(十五)CyclicBarrier應用場景
Java併發編程入門(十六)秒懂線程池差異
Java併發編程入門(十七)一圖掌握線程經常使用類和接口
Java併發編程入門(十八)再論線程安全post
Java極客站點: javageektour.com/優化