volatile關鍵字的做用

簡介
Java 語言提供了一種稍弱的同步機制,即 volatile 變量,用來確保將變量的更新操做通知到其餘線程。volatile 變量具有兩種特性:變量可見性、禁止重排序。緩存

做爲同步鎖
在訪問 volatile 變量時不會執行加鎖操做也就不會使執行線程阻塞,所以 volatile 變量是一種比 sychronized 關鍵字更輕量級的同步機制。
當對非 volatile 變量進行讀寫的時候,每一個線程先從內存拷貝變量到 CPU 緩存中。若是計算機有多個 CPU,每一個線程可能在不一樣的 CPU 上被處理,這意味着每一個線程能夠拷貝到不一樣的 CPU cache 中。而聲明變量是 volatile 的, JVM 保證了每次讀變量都從內存中讀,跳過 CPU cache這一步。安全

應用場景
volatile 變量的單次讀/寫操做是能夠保證原子性的,如 long 和 double 類型變量,可是並不能保證 i++這種操做的原子性,由於本質上 i++是讀、寫兩次操做。同時知足以下兩個條件可保證在併發環境中的線程安全。
1)對變量的寫操做不依賴於當前值(好比 i++),或者說是單純的變量賦值( boolean flag = true) 。
2)該變量沒有包含在具備其餘變量的不變式中, 也就是說,不一樣的 volatile 變量之間,不能互相依賴, 只有在狀態真正獨立於程序內其餘內容時才能使用 volatile。併發

END線程

相關文章
相關標籤/搜索