併發程式設計(3)volatile

2021-08-21 06:30:17 字數 626 閱讀 4401

原子性,可見性,有序性。只要有乙個不能保證,就有可能導致程式的執行錯誤

synchronized就能保障原子性,可見性,有序性,

1.因為synchronized能保障任意乙個時刻只有乙個執行緒執行該**塊,自然就不存在原子性的問題

2.在釋放鎖之前會將變數的修改重新整理到主存中,因此保證可見性

3.又因為每一時刻只有乙個執行緒在執行**,相當於讓執行緒順序執行同步**,所以也可以保證有序性。

所以synchronized可保證原子性,可見性(乙個執行緒修改了這個變數的值,在另乙個執行緒中能讀到這個修改後的值),有序性

mov    0xc(%r10),%r8d ; load

inc %r8d ; increment

mov %r8d,0xc(%r10) ; store

lock addl $0x0,(%rsp) ; storeload barrier

3.volatile為什麼沒有原子性?

因為資料的修改涉及到(1)將變數載入到工作記憶體(2)修改變數 (3)寫回到主記憶體(4)記憶體屏障指令使其它cpu裡快取了該位址的資料失效  。這四步操作,但這不能看作乙個原子操作,因為只有第四步是執行緒安全的,其它不是

併發程式設計 volatile

併發程式設計中的三個概念 原子性即乙個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行 可見性指當多個執行緒訪問同乙個變數時,乙個執行緒修改了這個變數的值,其他執行緒能夠立即看得到修改的值 有序性即程式執行的順序按照 的先後順序執行 jvm在真正執行這段 的時候會保證語...

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只能確保可見性,但不能保證原...