Java並發架構——AQS阻塞隊列管理(一),javaaqs

來源:互聯網
上載者:User

Java並發架構——AQS阻塞隊列管理(一),javaaqs
我們知道一個線程在嘗試擷取鎖失敗後將被阻塞並加入等待隊列中,它是一個怎樣的隊列?又是如何管理此隊列?這節聊聊CHL Node FIFO隊列。
 在談到CHL Node FIFO隊列之前,我們先分析這種隊列的幾個要素。首先要瞭解的是自旋鎖,所謂自旋鎖即是某一線程去嘗試擷取某個鎖時,如果該鎖已經被其他線程佔用的話,此線程將不斷迴圈檢查該鎖是否被釋放,而不是讓此線程掛起或睡眠。它屬於為了保證共用資源而提出的一種鎖機制,與互斥鎖類似,保證了公用資源在任意時刻最多隻能由一條線程擷取使用,不同的是互斥鎖在擷取鎖失敗後將進入睡眠或阻塞狀態。下面利用代碼實現一個簡單的自旋鎖,
public class SpinLock {
private static Unsafe unsafe = null;
private static final long valueOffset;
private volatile int value = 0;
static {
try {
unsafe=getUnsafeInstance();
valueOffset = unsafe.objectFieldOffset(SpinLock.class
.getDeclaredField("value"));
} catch (Exception ex) {
throw new Error(ex);
}
}
private static Unsafe getUnsafeInstance() throws SecurityException,
NoSuchFieldException, IllegalArgumentException,
IllegalAccessException {
Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeInstance.setAccessible(true);
return (Unsafe) theUnsafeInstance.get(Unsafe.class);
}
public void lock() {
for (;;) {
            int newV = value + 1;
            if (unsafe.compareAndSwapInt(this, valueOffset, 0, newV)){
            return ;
            }
        }
}
public void unlock() {
unsafe.compareAndSwapInt(this, valueOffset, 1, 0);
}
}
這是一個很簡單的自旋鎖,主要看加粗加紅的兩個方法lock和unlock,Unsafe僅僅是為操作提供了硬體層級的原子CAS操作,暫時忽略此類,只要知道它的作用即可,我們將在後面的“原子性如何保證”小節中對此進行更加深入的闡述。對於lock方法,假如有若干線程競爭,能成功通過CAS操作修改value值為newV的線程即是成功擷取鎖的線程,將直接通過,而其他的線程則不斷在迴圈檢測value值是否又改回0,而將value改為0的操作就是擷取鎖的線程執行完後對該鎖進行釋放,通過unlock方法釋放鎖,釋放後若干線程又對該鎖競爭。如此一來,沒擷取的鎖也不會被掛起或阻塞,而是不斷迴圈檢查狀態。圖2-5-9-3可加深自旋鎖的理解,五條線程輪詢value變數,t1擷取成功後將value置為1,此狀態時其他線程無法競爭鎖,t1使用完鎖後將value置為0,剩下的線程繼續競爭鎖,以此類推。這樣就保證了某個地區塊的執行緒安全性。
 
圖2-5-9-3 自旋鎖
自旋鎖適用於鎖佔用時間短,即鎖保護臨界區很小的情景,同時它需要硬體層級操作,也要保證各快取資料的一致性,另外,無法保證公平性,不保證先到先獲得,可能造成線程饑餓。在多處理器機器上,每個線程對應的處理器都對同一個變數進行讀寫,而每次讀寫操作都將要同步每個處理器緩衝,導致系統效能嚴重下降。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.