1. 程式人生 > >無鎖執行緒通訊(1)

無鎖執行緒通訊(1)

volatile修飾,表示一個變數不進行暫存器優化,每次使用必須從記憶體中讀取。

在兩個執行緒間通訊的時候,使用這個修飾,可以減少對鎖的依賴。這意味著降低死鎖的機會,提高效率。

我們假設存在兩個執行緒,A和B。我們在A和B之間建立兩條通道,A到B的通道和B到A的通道。

每個通道都有兩個狀態,當前有貨和當前沒貨。這個狀態用volatile來修飾,並確保它的寫操作是原子操作

我們先考慮A到B的通道,考慮通一個,另一個通道就反方向建立起來就可以了。

在A到B的通道中:
  - A來檢查通道的狀態,是否是當前沒貨。如果是,就把貨放到通道里,然後修改通道狀態為當前有貨。
  - B來檢查通道的狀態,是否是當前有貨。如果是,就把貨從通道里取出,然後修改通道狀態為當前沒貨。

以上兩個步驟因為是在A、B兩個執行緒內同步進行的,所以沒有標註順序號。


用上面的步驟,不論貨有多大,多麼複雜。他們的讀寫操作都被這個修飾為volatile的狀態給限制在他們應該在的那個執行緒。

通過分析,我們總結出一個無鎖通訊的結論:用volatile的狀態檢查和原子操作的狀態修改,隔離資料讀寫。

雖然現在只是在兩個執行緒間進行通訊,不過這個結論,卻可以應用到多個執行緒同時參與的環境。