volatile修飾,表示一個變量不進行寄存器優(yōu)化,每次使用必須從內(nèi)存中讀取。
在兩個線程間通信的時候,使用這個修飾,可以減少對鎖的依賴。這意味著降低死鎖的機會,提高效率。
我們假設存在兩個線程,A和B。我們在A和B之間建立兩條通道,A到B的通道和B到A的通道。
每個通道都有兩個狀態(tài),當前有貨和當前沒貨。這個狀態(tài)用volatile來修飾,并確保它的寫操作是原子操作。
我們先考慮A到B的通道,考慮通一個,另一個通道就反方向建立起來就可以了。
在A到B的通道中:
- A來檢查通道的狀態(tài),是否是當前沒貨。如果是,就把貨放到通道里,然后修改通道狀態(tài)為當前有貨。
- B來檢查通道的狀態(tài),是否是當前有貨。如果是,就把貨從通道里取出,然后修改通道狀態(tài)為當前沒貨。
以上兩個步驟因為是在A、B兩個線程內(nèi)同步進行的,所以沒有標注順序號。
用上面的步驟,不論貨有多大,多么復雜。他們的讀寫操作都被這個修飾為volatile的狀態(tài)給限制在他們應該在的那個線程。
通過分析,我們總結出一個無鎖通信的結論:
用volatile的狀態(tài)檢查和原子操作的狀態(tài)修改,隔離數(shù)據(jù)讀寫。雖然現(xiàn)在只是在兩個線程間進行通信,不過這個結論,卻可以應用到多個線程同時參與的環(huán)境。