1.正確理解鎖的概念,就要理解兩個key point:原子性(atmatic)與可見性。synchronized在原子性和可見性上都很好,volatile 在原子性上沒有強約束,在可見性上和synchronized一樣
可見性是指一直變數的內容在乙個執行緒中修改後,其他執行緒或方法能否在下次訪問時訪問到正確的值。這本來是乙個簡單的概念,但是在現代編譯優化技術的操作下,變數的修改以及同步(publish)並不一定是及時和可見的。synchronized和volatile通過一些機制,確保了visibility。
鎖提供了兩種主要特性:
互斥(mutual exclusion)
和可見性(visibility)
。互斥即一次只允許乙個執行緒持有某個特定的鎖,因此可使用該特性實現對共享資料的協調訪問協議,這樣,一次就只有乙個
程能夠使用該共享資料。可見性要更加複雜一些,它必須確保釋放鎖之前對共享資料做出的更改對於隨後獲得該鎖的另乙個執行緒是可見的 —— 如果沒有同步機制提供的這種可見性保證,執行緒看到的共享變數可能是修改前的值或不一致的值,這將引發許多嚴重問題。」
2. 如何正確使用volatile?
您只能在有限的一些情形下使用 volatile 變數替代鎖。要使 volatile 變數提供理想的執行緒安全,必須同時滿足下面兩個條件:
volatile 變數使用指南
volatile 變數具有 synchronized 的可見性特性,但是不具備原子特性。這就是說執行緒能夠自動發現 volatile 變數的最新值。volatile 變數可用於提供執行緒安全,但是只能應用於非常有限的一組用例 多個變數之間或者某個變數的當前值與修改後值之間沒有約束。因此,單獨使用 v...
linux中使用volatile(附加變數型別)
1 自動變數就是在函式內部定義的變數,只在內部有效 2 所以允許其他函式定義相同的變數 3 他們都有自己的區域性,沒有連線性 4 自動變數分配記憶體就壓棧,函式返回時退棧 5 一般不作專門說明的區域性變數,均是自動變數,比如static說明 6 自動變數使用棧機制使用記憶體 1 記憶體中的位置 靜態...
volatile型別變數
最近在 裡發現了乙個叫volatile型別的變數,竟然從來沒見過,因此特搜尋一番,以增加點見識。volatile 的作用 作為指令關鍵字 確保本條指令不會因編譯器 的優化而省略,且要求每次直接讀值.簡單地說就是防止編譯器對 進行優化.比如如下程式 xbyte 2 0x55 xbyte 2 0x56 ...