1. 程式人生 > 程式設計 >Java併發程式設計入門(十)鎖優化

Java併發程式設計入門(十)鎖優化

Java極客  |  作者  /  鏗然一葉
這是Java極客的第 38 篇原創文章

一、鎖優化

鎖的優化如下:
1.使用無鎖方案
2.避免死鎖
3.減小鎖持有時間
4.鎖分離
5.鎖粗化
6.減小鎖粒度

無鎖方案單獨介紹,避免死鎖可參考: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併發程式設計入門(十八)再論執行緒安全


Java極客站點: javageektour.com/