1. 程式人生 > >volatile不能保證原子性,也就不能保證執行緒安全

volatile不能保證原子性,也就不能保證執行緒安全

volatile只能保證變數的可見性,無法保證對變數的操作的原子性。

還是以最常用的i++來說吧,包含3個步驟
1,從記憶體讀取i當前的值
2,加1
3,把修改後的值重新整理到記憶體

  • 對於普通變數來說多執行緒下1,2之間被中斷,其它執行緒修改了i的值,那原來已經在1,2之間被中斷的執行緒的i的值就已經無效了,所以多執行緒是不安全的。
  • 另外對於普通變數來說,步驟1並不是每次都會從記憶體中讀取,步驟3也並不會每次都保證會立即重新整理到記憶體。
  • 所以這裡有兩個問題,可見性和原子性。
  • viloate只能保證可見性,即步驟1每次都重新讀,步驟3每次都立即重新整理到主記憶體。但如果多個執行緒通知執行到1和2,就會造成交叉修改,所以是執行緒不安全的。

另一方面,由於synchronized不僅能保證程式碼塊中操作的原子性,而且能保證變數的可見性,所以synchronized能夠保證執行緒安全。

相關推薦

volatile不能保證原子不能保證執行安全

volatile只能保證變數的可見性,無法保證對變數的操作的原子性。 還是以最常用的i++來說吧,包含3個步驟 1,從記憶體讀取i當前的值 2,加1 3,把修改後的值重新整理到記憶體 對於普通變數來說多執行緒下1,2之間被中斷,其

SqlSessionTemplate是如何保證的MyBatis中的SqlSession的執行安全的?

一,DefaultSqlSession的執行緒不安全性 在MyBatis的架構中的SqlSession是提供給外層呼叫的頂層介面,實現類有:DefaultSqlSession,SqlSessionManager以及MyBatis的彈簧提供的實現SqlSession

spring mvc記錄各個controller訪問開始結束時間以及耗時時間 執行安全

package cn.test.web.interceptor;   public class StopWatchHandlerInterceptor extends HandlerInterceptorAdapter&nbs

Kotlin 寫的環形 ByteBuffer理論上是執行安全的。

class CircleByteBuffer(val size:Int) { private val datas=ByteArray(size) private var start=0 private var end=0 fun getL

volatile 可以保證可見但不能保證原子

轉自:http://blog.csdn.net/shukebai/article/details/51163068 在Java執行緒併發處理中,有一個關鍵字volatile的使用目前存在很大的混淆,以為使用這個關鍵字,在進行多執行緒併發處理的時候就可以萬事大吉。 J

為什麼volatile不能保證原子而Atomic可以?

在上篇《非阻塞同步演算法與CAS(Compare and Swap)無鎖演算法》中講到在Java中long賦值不是原子操作,因為先寫32位,再寫後32位,分兩步操作,而AtomicLong賦值是原子操作,為什麼?為什麼volatile能替代簡單的鎖,卻不能保證原子性?這裡面涉及volatile,是java中的

volatile為什麼不能保證原子的思考

1、故事的起因:         前幾天有人問過關於volatile關鍵字的一些問題, 想起了自己剛接觸這個關鍵字時候存在的疑惑,趕上今天有時間就整理了一些自己的想法。         首先,需要明確的一點是,volatile關鍵字修飾的變數可以保證該變數操作的有序性和可

為什麼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進行操作

即使被拖庫可以保證密碼不泄露-加鹽

常用 隨著 src 意義 解決方案 為什麽 算法 簡單的 hash 在前一篇文章《設計安全的賬號系統的正確姿勢》中,主要提出了一些設計的方法和思路,並沒有給出一個更加具體的,可以實施的安全加密方案。經過我仔細的思考並了解了目前一些方案後,我設計了一個自認為還比較安全的安全加

Java併發程式設計:volatile關鍵字解析-原子可見有序性

volatile這個關鍵字可能很多朋友都聽說過,或許也都用過。在Java 5之前,它是一個備受爭議的關鍵字,因為在程式中使用它往往會導致出人意料的結果。在Java 5之後,volatile關鍵字才得以重獲生機。   volatile關鍵字雖然從字面上理解起來比較簡單,但是要用好不是一件容易的事情

Java關鍵字volatile原子變數可見

The volatile keyword also ensures visibility across the application. If you declare a field to be volatile, this means that as soon as a write occurs for t

為什麼volatile無法保證執行安全

Java記憶體模型 java使用的是共享變數模型,如下圖所示   執行緒1要讀取執行緒2修改後的值必須要執行緒2寫回到記憶體,執行緒1再讀取。 Jvm又是如何讀取主存變數到執行緒中的呢? 記憶體間的相互操作 lock 將物件變成執行緒獨佔的狀態 unlock 將執行緒獨佔

在 Java 的多執行如何去判斷給定的一個類是否是執行安全的(另外:synchronized 同步是否一定能保證該類是執行安全的。)

同步程式碼塊和同步方法的區別:同步程式碼塊可以傳入任意物件,同步方法中 如果多個執行緒檢查的都是一個新的物件,不同的同步鎖對不同的執行緒不具有排他性,不能實現執行緒同步的效果,這時候執行緒同步就失效了。   兩者的區別主要體現在同步鎖上面。對於例項的同步方法,因為只能使用

深入理解Atomic原子操作和volatile原子

log tile 修飾 深入 clas 同時 結果 一個 body 原子操作可以理解為: 一個數,很多線程去同時修改它,不加sync同步鎖,就可以保證修改結果是正確的 Atomic正是采用了CAS算法,所以可以在多線程環境下安全地操作對象。 volatile是Java的關鍵

(轉)理解這兩點理解了paxos協議的精髓

轉發 https://blog.csdn.net/qq_35440678/article/details/78080431   什麼是paxos協議?Paxos用於解決分散式系統中一致性問題。分散式一致性演算法(Consensus Algorithm)是一個分散式計算領域的基礎性問題,其最基本的

java併發之----原子可見和有序性(轉載)

一、併發程式設計中的三個概念 在併發程式設計中,我們通常會遇到以下三個問題:原子性問題,可見性問題,有序性問題。我們先看具體看一下這三個概念: 1.原子性 原子性:即一個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。 一個很經典的例子就是銀行

對於long和double型變數的特殊規則及原子可見和有序性

Java記憶體模型要求lock,unlock,read,load,assign,use,store,write這8個操作都具有原子性,但對於64位的資料型別(long或double),在模型中定義了 一條相對寬鬆的規定,允許虛擬機器將沒有被volatile修飾的64位資料的讀

為什麼volatile關鍵字保證不了執行安全

在當前高併發的時代,不懂一點高併發多執行緒都不好意思出去,即使沒地方使用,網上大多數相關文件部落格也都講解了這些部分。    我並不想具體介紹什麼是volatile,我寫這篇部落格目的是說明白為什麼vo