日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

原子变量、volatile、synchronized的可见性和原子性比较

發布時間:2025/4/5 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 原子变量、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的可见性和原子性比较的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。