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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java 什么是内存屏障,java内存屏障和可见性

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 什么是内存屏障,java内存屏障和可见性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

內存屏障

由于現代的操作系統都是多處理器.而每一個處理器都有自己的緩存,并且這些緩存并不是實時都與內存發生信息交換.這樣就可能出現一個cpu上的緩存數據與另一個cpu上的緩存數據不一致的問題.而這樣在多線程開發中,就有可能導致出現一些異常行為.

而操作系統底層為了這些問題,提供了一些內存屏障用以解決這樣的問題.目前有4種屏障.

LoadLoad屏障:對于這樣的語句Load1; LoadLoad; Load2,在Load2及后續讀取操作要讀取的數據被訪問前,保證Load1要讀取的數據被讀取完畢。

StoreStore屏障:對于這樣的語句Store1; StoreStore; Store2,在Store2及后續寫入操作執行前,保證Store1的寫入操作對其它處理器可見。

LoadStore屏障:對于這樣的語句Load1; LoadStore; Store2,在Store2及后續寫入操作被刷出前,保證Load1要讀取的數據被讀取完畢。

StoreLoad屏障:對于這樣的語句Store1; StoreLoad; Load2,在Load2及后續所有讀取操作執行前,保證Store1的寫入對所有處理器可見。它的開銷是四種屏障中最大的。在大多數處理器的實現中,這個屏障是個萬能屏障,兼具其它三種內存屏障的功能。

使用

java中對內存屏障的使用在一般的代碼中不太容易見到.常見的有兩種.

通過 Synchronized關鍵字包住的代碼區域,當線程進入到該區域讀取變量信息時,保證讀到的是最新的值.這是因為在同步區內對變量的寫入操作,在離開同步區時就將當前線程內的數據刷新到內存中,而對數據的讀取也不能從緩存讀取,只能從內存中讀取,保證了數據的讀有效性.這就是插入了StoreStore屏障

使用了volatile修飾變量,則對變量的寫操作,會插入StoreLoad屏障.

其余的操作,則需要通過Unsafe這個類來執行.

Unsafe中內存屏障的使用

UNSAFE.putOrderedObject類似這樣的方法,會插入StoreStore內存屏障

Unsafe.putVolatiObject 則是插入了StoreLoad屏障

總結

以上是生活随笔為你收集整理的java 什么是内存屏障,java内存屏障和可见性的全部內容,希望文章能夠幫你解決所遇到的問題。

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