2012年11月14日 星期三

java 的 volatile 和 synchronized

在 java 中有 volatile 和 synchronized 關鍵字
synchronized 應該蠻常使用到的 大家都知道是甚麼意思
但是 volatile 就可能比較少用 這個關鍵字是用來修飾 "基本型態" 的變數
保證這個變數在多執行緒時的同步

這邊這邊有講到很有用的觀念
大意是在 java 中有主記憶體區域 而 thread 可以有自己私有的記憶體區域
某個 thread 中存取一個全域變數 可能會在存取完後將這個變數的值保存在自己私有的記憶體區域
這樣會造成多個 thread 存取全域變數時結果不同步
但是如果一個變數事前有用 volatile 修飾
則保證所有 thread 對這個變數做完存取時會將變數值寫回到主記憶體區域
這樣看似只要用 volatile 就可以完全保護好變數  其實不然
因為除非對這個變數的操作是 atomic operation
否則還是會出問題
像在第一個連結就有提到  java 中的 ++ 運算不是 atomic operation
所以如果多執行緒對某變數作 ++ 運算  就算用 volatile 還是不能保證變數的同步
因為 volatile 只能保證 thread 將值寫回主記憶體
並不能保證同一時間只有一個 thread 去存取這個變數
像是 ++ 不是 atomic operation 若是有個 thread 的 ++ 運算還沒做完 另一個 thread 是可以對這個變數作 ++ 的
只是他們都會把做完 ++ 的結果寫回主記憶體而已
這樣變數就未必會同步了

沒有留言:

張貼留言