volatile不能保證程式執行的原子性以及只能一定程度上保證有序性
多執行緒併發程式設計如何正確的執行程式:
1、原子性:執行過程要麼成功要麼失敗,比如經典的銀行轉賬問題。
2、可見性:多執行緒併發時,一個執行緒修改了工作記憶體中的值(主存中的值),會立刻改變主存相應地址的值,其它執行緒工作記憶體的值無效,重新獲取主存的值。
3、有序性:程式執行的順序,單個執行緒中沒有依賴的程式碼,cpu會進行指令重排,使程式碼執行順序調換,但是不影響最終執行的結果(單執行緒沒有任何問題,多執行緒就會出現問題)
總結:解決多執行緒併發問題,需要程式滿足上面三個條件才能正確執行。
volatile能保證第二點可見性。
volatile能禁止指令重排序(所以volatile能在一定程度上保證有序性),但是這裡只能保證volatile所修飾的變數之前的程式不會在該變數之後執行,該變數之後的程式碼不會在變數之前執行。
相關推薦
volatile不能保證程式執行的原子性以及只能一定程度上保證有序性
多執行緒併發程式設計如何正確的執行程式: 1、原子性:執行過程要麼成功要麼失敗,比如經典的銀行轉賬問題。 2、可見性:多執行緒併發時,一個執行緒修改了工作記憶體中的值(主存中的值),會立刻改變主存相應地址的值,其它執行緒工作記憶體的值無效,重新獲取主存的值。 3、有序性:程
volatile不能保證原子性,也就不能保證執行緒安全
volatile只能保證變數的可見性,無法保證對變數的操作的原子性。 還是以最常用的i++來說吧,包含3個步驟 1,從記憶體讀取i當前的值 2,加1 3,把修改後的值重新整理到記憶體 對於普通變數來說多執行緒下1,2之間被中斷,其
java併發程式設計之利用CAS保證操作的原子性
import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class Counter { private AtomicInteger at
為什麼volatile不能保證原子性而Atomic可以?
在上篇《非阻塞同步演算法與CAS(Compare and Swap)無鎖演算法》中講到在Java中long賦值不是原子操作,因為先寫32位,再寫後32位,分兩步操作,而AtomicLong賦值是原子操作,為什麼?為什麼volatile能替代簡單的鎖,卻不能保證原子性?這裡面涉及volatile,是java中的
volatile為什麼不能保證原子性的思考
1、故事的起因: 前幾天有人問過關於volatile關鍵字的一些問題, 想起了自己剛接觸這個關鍵字時候存在的疑惑,趕上今天有時間就整理了一些自己的想法。 首先,需要明確的一點是,volatile關鍵字修飾的變數可以保證該變數操作的有序性和可
volatile 可以保證可見性,但不能保證原子性
轉自:http://blog.csdn.net/shukebai/article/details/51163068 在Java執行緒併發處理中,有一個關鍵字volatile的使用目前存在很大的混淆,以為使用這個關鍵字,在進行多執行緒併發處理的時候就可以萬事大吉。 J
Java多執行緒之記憶體可見性和原子性:Synchronized和Volatile的比較
在刷題時,碰到一題:關於volatile關鍵字的說法錯誤的是: A. 能保證執行緒安全 B volatile關鍵字用在多執行緒同步中,可保證讀取的可見性 C JVM保證從主記憶體載入到執行緒工做記憶體的值是最新的 D volatile能禁止指令進行指令重排序 答案:A 處
為什麼volatile不能保證原子性而Atomic可以?(r)
在上篇《非阻塞同步演算法與CAS(Compare and Swap)無鎖演算法》中講到在Java中long賦值不是原子操作,因為先寫32位,再寫後32位,分兩步操作,而AtomicLong賦值是原子操作,為什麼?為什麼volatile能替代簡單的鎖,卻不能保證原子性?
Java併發程式設計之驗證volatile不能保證原子性
Java併發程式設計之驗證volatile不能保證原子性 通過系列文章的學習,凱哥已經介紹了volatile的三大特性。1:保證可見性 2:不保證原子性 3:保證順序。那麼怎麼來驗證可見性呢?本文凱哥(凱哥Java:kaigejava)將通過程式碼演示來證明為什麼說volatile不能夠保證共享變數的原子性操
Volatile不保證原子性(二)
Volatile不保證原子性 前言 通過前面對JMM的介紹,我們知道,各個執行緒對主記憶體中共享變數的操作都是各個執行緒各自拷貝到自己的工作記憶體進行操作後在寫回到主記憶體中的。 這就可能存在一個執行緒AAA修改了共享變數X的值,但是還未寫入主記憶體時,另外一個執行緒BBB又對主記憶體中同一共享變數X進行操作
Java線程安全 關於原子性與volatile的試驗
har length rgs 無法 over pub boolean 即使 dex 1. 變量遞增試驗 1 static /*volatile*/ int shared=0;//volatile也無法保證++操作的原子性 2 static synchr
深入理解Atomic原子操作和volatile非原子性
log tile 修飾 深入 clas 同時 結果 一個 body 原子操作可以理解為: 一個數,很多線程去同時修改它,不加sync同步鎖,就可以保證修改結果是正確的 Atomic正是采用了CAS算法,所以可以在多線程環境下安全地操作對象。 volatile是Java的關鍵
Java-JUC(二):volatile對Java內存模型中的可見性、原子性、有序性影響
UC volatil 可見 模型 原子性 有序性 juc 內存模型 volatile Java內存模型 Java內存模型-可見性 Java內存模型-原子性 Java內存模型-有序性 volatile-是否具有可見性? volatile
輕量級的同步機制——volatile語義詳解(可見性保證+禁止指令重排)
sta 指令重排 指向 runnable single 能夠 工作 star image 1.關於volatile volatile是java語言中的關鍵字,用來修飾會被多線程訪問的共享變量,是JVM提供的輕量級的同步機制,相比同步代碼塊或者重入鎖有更好的性能。它主要有兩重
AtomicInteger如何保證執行緒安全以及樂觀鎖/悲觀鎖的概念
最近面試被問到一個問題,AtomicInteger如何保證執行緒安全?我查閱了資料 發現還可以引申到 樂觀鎖/悲觀鎖的概念,覺得值得一記。 眾所周知,JDK提供了AtomicInteger保證對數字的操作是執行緒安全的,執行緒安全我首先想到了synchronized和Lock,但是這
高併發第三彈:執行緒安全-原子性
執行緒安全性? 執行緒安全性主要體現在三個方面:原子性、可見性、有序性 原子性:提供了互斥訪問,同一時刻只能有一個執行緒來對它進行操作 可見性:一個執行緒對主記憶體的修改可以及時的被其他執行緒觀察到 有序性:一個執行緒觀察其他執行緒中的指令執行順序,由於指令重排序的存在,該觀察結果一般雜亂無序。 本章主
easy-base-concurrent | 執行緒安全-原子性
Atomic包 AtomicXXX:CAS、unsafe.compareAndSwapInt @ThreadSafe @Slf4j public class SafeCountAtomic {
水滴石穿--多執行緒原子操作、threadlocal、volatile、多執行緒下的單例模式
接著上一篇文章,下面看看幾個比較好理解的知識點!! volatile java關鍵字volatile修飾的變數從字面意義上理解易變的,不穩定的,事實上時告訴編譯器該變數是易變的不要對該變數使用快取等級的優化,每次都從記憶體地址中讀取值。 不過並沒有說明在對volatile修飾的變數進行修
從volatile分析i++和++i非原子性問題
目錄 1、可見性(Visibility) 2、原子性(Atomicity) 3、Java記憶體模型的抽象結構( JMM ) 4、volatile 5、 多執行緒下的i++問題 5、自定義實現i++原子操作 5.1
執行緒安全性之原子性——synchronized關鍵字
執行緒安全性之原子性——synchronized關鍵字 synchronized是java的一個關鍵字,是依賴JVM來實現鎖。在這個關鍵字的作用物件的作用範圍內,都只能有一個執行緒來執行 我們來看一下synchronized關鍵字的作用範圍。他有四種作用範圍 下面我將給出4中範圍的程