併發程式設計 volatile

2021-09-10 13:09:25 字數 1295 閱讀 2766

併發程式設計中的三個概念

原子性即乙個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行

可見性指當多個執行緒訪問同乙個變數時,乙個執行緒修改了這個變數的值,其他執行緒能夠立即看得到修改的值

有序性即程式執行的順序按照**的先後順序執行(jvm在真正執行這段**的時候會保證語句1一定會在語句2前面執行嗎?不一定,為什麼呢?這裡可能會發生指令重排序)

volatile關鍵字

修飾類的成員變數、類的靜態成員變數,被volatile修飾之後,那麼就具備了兩層語義 1)保證了不同執行緒對這個變數進行操作時的可見性,即乙個執行緒修改了某個變數的值,這新值對其他執行緒來說是立即可見的 2)禁止進行指令重排序

volatile能保證對變數的操作是原子性嗎

public class volatile02 

public static void main(string args)

}).start();}}

}

列印10009

列印10010

列印10011

列印9831

列印10013

列印10014

列印10015

改為

public class volatile02  finally

}public static void main(string args)

}).start();}}

}

使用場景

1)對變數的寫操作不依賴於當前值2)該變數沒有包含在具有其他變數的不變式中---上面的2個條件需要保證操作是原子性操作

在看乙個單例模式

class singleton

public static singleton getinstance()

}return instance;

}}

對於singleton這個變數為什麼使用volatile修飾,因為new singleton這個操作並不是原子的,它實際上執行了以下幾個操作 1、給instance 分配記憶體 2、呼叫singleton的init方法,實現引數的構建操作 3、將instance執向分配的記憶體 對於上面的操作,其執行順序有可能是1-2-3,也有可能是1-3-2,如果是1-3-2,instance的值不為null,但是init方法還沒有執行完,其他的執行緒在呼叫時,發現不為null, 直接返回,那就就會丟擲異常

併發程式設計(3)volatile

原子性,可見性,有序性。只要有乙個不能保證,就有可能導致程式的執行錯誤 synchronized就能保障原子性,可見性,有序性,1.因為synchronized能保障任意乙個時刻只有乙個執行緒執行該 塊,自然就不存在原子性的問題 2.在釋放鎖之前會將變數的修改重新整理到主存中,因此保證可見性 3.又...

Java併發程式設計 JMM和volatile關鍵字

通過快取一致性協議 string s abc int i 0 i i 0 主記憶體 i 執行緒1 j i 執行緒22.被volatile關鍵字修飾變數不會指令重排序。public class novisibility private static class readthread extends t...

Java併發程式設計之volatile變數

volatile提供了弱同步機制,用來確保將變數更新通知到其它執行緒。volatile變數不會被快取在暫存器中或者對其它處理器不可見的地方,因此在讀取volatile變數時總會返回最新寫入的值。可以想象成如下語義,然而volatile是更輕量級的同步機制。volatile只能確保可見性,但不能保證原...