原子变量、volatile、synchronized的可见性和原子性比较
為什么80%的碼農都做不了架構師?>>> ??
? ? ? jdk5提供了java.util.concurrent包,這個包并行功能強大,工具齊全,其中就包括原子變量atomic
? ? ? 那么我們先說說volatile,volatile可以保證內存的可見性,禁用重排序,但是不能保證操作的原子性,不具備互斥性,那么,什么時候可以用volatile呢?必須同時滿足以下三條:
- 不依賴自己:寫變量時并不依賴變量的當前值。
- 不依賴別人:變量不與其他狀態共同組成invariant。
- 訪問變量時,沒有其他原因需要加鎖。
? ? ? ?只解釋一下第一條,“不依賴自己的當前值”,舉個簡單的例子:count++, 這個就叫依賴當前值。為什么要有這樣的限制?因為,volatile不保證count++是原子的,即我們所說的“互斥執行”,雖然我們過去的例子都把一條代碼當作一個動作,但相信你知道,一條代碼在CPU那里多半不會是一條指令,比如count++其實會分解為load-modify-store三個更小的動作,如果這樣的操作有多個線程在做,是極易出錯的。
? ? ?原子變量的特點在于其原子性的CAS(compare-and-swap)操作,由此可以完成volatile所不能的“check-and-act”動作,同時它可以保證內存的可見性,“可見性”只不過是其稍帶腳支持的功能而已。
? ? ? Java.util.concurrent中實現的原子操作類包括:AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference。另外其底層就是volatile和CAS 共同作用的結果:
? ? ?1.首先使用了volatile 保證了內存可見性。
? ? ?2.然后使用了CAS(compare-and-swap)算法 保證了原子性。
? ? ?其中CAS算法的原理就是里面包含三個值:內存值A ?預估值V ?更新值 B ?當且僅當 V == A 時,V = B; 否則,不會執行任何操作。
? ? ? synchronized鎖不僅僅有“互斥”的功能,將多步操作加鎖保證了原子操作,而且還保證了內存可見性。
?
轉載于:https://my.oschina.net/GinkGo/blog/1560155
總結
以上是生活随笔為你收集整理的原子变量、volatile、synchronized的可见性和原子性比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 测试模型
- 下一篇: [Spring boot] Spring