什麼是非阻塞同步?

同步:多線程併發訪問共享數據時,保證共享數據再同一時刻只被一個或一些線程使用安全

阻塞:就是read時,內核緩衝區中必須有數據,若是沒有數據那麼就一直等待多線程

非阻塞:就是read時,內核緩衝區中若是沒有數據,也能夠馬上返回,errno爲EGAIN,下一次再進行讀取便可。併發

實例:AtomicInteger性能

public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

阻塞同步和非阻塞同步都是實現線程安全的兩個保障手段,非阻塞同步對於阻塞同步而言主要解決了阻塞同步中線程阻塞和喚醒帶來的性能問題,那什麼叫作非阻塞同步呢?在併發環境下,某個線程對共享變量先進行操做,若是沒有其餘線程爭用共享數據那操做就成功;若是存在數據的爭用衝突,那就纔去補償措施,好比不斷的重試機制,直到成功爲止,由於這種樂觀的併發策略不須要把線程掛起,也就把這種同步操做稱爲非阻塞同步(操做和衝突檢測具有原子性)。在硬件指令集的發展驅動下,使得 "操做和衝突檢測" 這種看起來須要屢次操做的行爲只須要一條處理器指令即可以完成,這些指令中就包括很是著名的CAS指令(Compare-And-Swap比較並交換)。

this

簡單來講,就是若是比較後若是返回成功,就返回結果;執行後若是比較失敗,就再來一次。spa

相關文章
相關標籤/搜索