Java 關鍵字-volatile
阿新 • • 發佈:2022-01-11
volatile 介紹
volatile 是 Java 提供的一種輕量級的同步機制。Java 語言包含兩種內在的同步機制:同步塊或者說方法和 volatile 變數,相比於 synchronized 重量級鎖,volatile 更輕量級,因為它不會引起執行緒上下文的切換和排程。但是 volatile 變數的同步性較差,而且其使用也更容易出錯。
volatile 保證可見性,不保證原子性
可見性
當要給執行緒寫 volatile 變數時,JMM 會把該執行緒本地記憶體中的變數立即重新整理到主記憶體中去,這個操作會導致其他執行緒中的 volatile 變數快取無效。
原子性
一個變數被 volatile 修飾,兩個執行緒都想對這個變數修改,都獲取了最新的值,對其進行自增操作也就是 i++,i++ 的過程可以分為三步,首先獲取 i 的值,其次對值進行加 1,最後將得到的新值寫會到快取中。那麼最後的結果是增加了 1,而不是正確的 2。所以,如果一個變數被 volatile 修飾了,那麼肯定可以保證每次讀取這個變數值的時候得到的值是最新的,但是一旦需要對變數進行自增這樣的非原子操作,就不會保證這個變數的原子性了。
總結
Java 中只有對基本型別變數的賦值和讀取是原子操作,如 i = 1 的賦值操作,但是像 j = i 這樣的操作都不是原子操作,因為進行了多次原子操作,比如先讀取 i 的值,再將 i 的值賦值給 j,兩個原子操作加起來就不是原子操作了。