鎖優化的建議

2021-08-03 10:38:13 字數 2513 閱讀 7956

它的核心思想就是不要在不必需要的**上加鎖,因為執行緒持有的鎖時間過長,相對地,鎖的競爭程度也就越激烈。

看下面的**:

public

synchronized

void

syncmethod()

public

void

syncmethod()

othercode2();

}

減小鎖粒度也是一種削弱多執行緒鎖競爭的有效手段。典型的使用場景就是concurrenthashmap。

對於hashmap來說,最重要的兩個方法就是get和put方法。一種最自然的想法就是對整個hashmap加鎖,必然可以得到乙個執行緒安全的物件。但是這樣做,加鎖的粒度太大,對於concurrenthashmap,它內部進一步細分了若干個小的hashmap,稱之為段 segment。預設情況下concurrenthashmap,被進一步細分為16個段。

如果需要在concurenthashmap中增加乙個新的表項,並不是將整個hashmap加鎖,而是首先根據hashcode得到該表項應該被存放到那個段中,然後對該段加鎖,並完成put操作。在多執行緒環境中,如果多個執行緒同時進行put操作,只要被加入的表項不存放在同乙個段中,則執行緒間便可以做到真正的並行。

@suppresswarnings("unchecked")

public v put(k key, v value)

使用讀寫鎖readwritelock可以提供系統的效能。

如果將讀寫鎖的思想做進一步的延伸,就是鎖分離。典型的案例就是linkedblockingqueue的實現。

如果使用獨佔鎖,則要求在兩個操作進行時,獲取當前佇列的獨佔鎖,那麼take和put操作就不可能真正的併發,在執行時,它們會彼此等待對方釋放鎖資源。在這種情況下,鎖競爭會相對比較激烈,從而影響程式在高併發的效能。

因此在jdk的實現中,並沒有採用這樣的方式,取而代之的是把兩把不同的鎖,分離了take和put操作。

/** lock held by take, poll, etc */

private

final reentrantlock takelock = new reentrantlock();

/** wait queue for waiting takes */

private

final condition notempty = takelock.newcondition();

/** lock held by put, offer, etc */

private

final reentrantlock putlock = new reentrantlock();

/** wait queue for waiting puts */

private

final condition notfull = putlock.newcondition();

/** current number of elements */

private

final atomicinteger count = new atomicinteger(0);

下面來看下take的原始碼:

public e take() throws interruptedexception 

x = dequeue(); // 獲取乙個元素

c = count.getanddecrement();//元素的數量減一

if (c > 1)

notempty.signal();// 大於1,喚醒其他執行緒進行take操作。

} finally

if (c == capacity)

signalnotfull();

return x;

}

下面看 put的原始碼

public void put(e e) throws interruptedexception 

enqueue(node); // 存放乙個元素

c = count.getandincrement();//數量加一

if (c + 1

< capacity)// 還有空間,喚醒其他的執行緒進行put操作。

notfull.signal();

} finally

if (c == 0)

signalnotempty();

}

虛擬機器在遇到一連串連續地對同一鎖不斷進行請求和釋放的操作時,便會把所有的鎖操作整合成對鎖的一次請求,從而減少對鎖的請求同步次數,這個操作叫做鎖的粗化。

看下面的**就清楚了

public

void

syncmethod()

synchronized (this)

}

public

void

syncmethod()

}

優化SQL的建議

1.用truncate替代delete 當刪除表中的記錄時,在通常情況下,回滾段 rollback segments 用來存放可以被恢復的資訊。如果你沒有 commit事務,oracle會將資料恢復到刪除之前的狀態 準確地說是恢復到執行刪除命令之前的狀況 而當運用truncate時,回滾段不再存放任...

linux 建議鎖和強制鎖

linux是有強制鎖的,但是預設不開啟.想讓linux支援強制性鎖,不但在mount的時候需要加上 o mand,而且對要加鎖的檔案也需要設定相關許可權。1 建議鎖又稱協同鎖。對於這種型別的鎖,核心只是提供加減鎖以及檢測是否加鎖的操作,但是不提供鎖的控制與協調工作。也就是說,如果應用程式對某個檔案進...

linux 建議鎖和強制鎖

作為 apue 14.3 節的參考 linux 是有強制鎖的 但是預設不開啟.想讓 linux 支援強制性鎖,不但在 mount 的時候需要加上 o mand,而且對要加鎖的檔案也需要設定相關許可權。1 建議鎖又稱協同鎖。對於這種型別的鎖,核心只是提供加減鎖以及檢測是否加鎖的操作,但是不提供鎖的控制...