久久精品国产99国产精品,农村大炕弄老女人,人马配速90分钟,香蕉成人伊视频在线观看

spring框架 為什么在多核多線程程序中要慎用volatile關鍵字?

為什么在多核多線程程序中要慎用volatile關鍵字?由于volatile不能保證它的原子性,它只能保證一個線程在修改后對其他線程可見,特別是當多個線程自動激活并減少一個變量時,會導致變量錯誤。參考《

為什么在多核多線程程序中要慎用volatile關鍵字?

由于volatile不能保證它的原子性,它只能保證一個線程在修改后對其他線程可見,特別是當多個線程自動激活并減少一個變量時,會導致變量錯誤。參考《深入理解Java虛擬機》一書,volatile用于以下場景:

1>操作結果不依賴于變量的當前值,或者可以確保只有一個線程修改變量的值。

2>變量不需要與其他狀態變量一起參與不變約束。因此,在使用volatile關鍵字時,應該小心。不僅僅是簡單的類型變量被volatile修改。此變量上的所有操作都是原始操作。當一個變量的值由它以前的值決定時,例如n=n1,n volatile關鍵字將無效。只有當一個變量的值與其前一個值無關時,對該變量的操作才能是原子級的,例如n=m1,這是原始級別。因此,在使用volatile鍵時必須小心。如果不確定,可以使用synchronized而不是volatile。

為什么在多核多線程程序中要慎用volatile關鍵字?

一般來說,volatile關鍵字有兩個用途:一個用于處理ISO C/C中的“異常”內存行為(此用途僅保證編譯器不會進行任何優化,并且對多核CPU是否會無序優化沒有約束力),另一個用于Java/中。Net(包括visualbasic)Studio)實現高性能并行算法(這種使用通過內存屏障保證CPU/編譯器的有序性,通過JVM或CLR保證易失變量讀寫操作的原子性)。總之,volatile對于多線程編程是非常危險的。當您使用它時,您必須小心您的代碼是否以您想要的方式在多核上執行,特別是對于尚未引入內存模型的C/C程序。為了安全起見,我們仍然使用pthread,Java.util.concurrent文件TBB等并行庫提供了lock/spinlock、條件變量、barrier、原子變量等同步方法來很好的工作,因為它們的內部實現調用了相應的內存barrier來保證內存的有序性。你只需要確保你的多線程程序沒有數據是的,pthreads庫也有自己的內存模型,但是它的內存模型有一些缺點,所以直接將多線程內存模型集成到C/C中是一個更好的方法,這也是將來的趨勢,而不是在volatile中添加獲取和釋放語義關鍵字,如Java/。Net中,我們將提供另一種具有同步語義的原子變量。如果要實現更高性能的無鎖算法,或者使用volatile進行同步,首先需要了解CPU的內存模型和編程語言,然后時刻注意原子性和有序性是否得到保證。(注意:沒有acquire/release語義的情況下使用volatile變量進行同步是錯誤的,但是您仍然可以在C/C中使用volatile來修改一個不用于同步的變量(例如事件),它只是一個由不同線程讀寫的共享變量,但當它的新值可以被另一個線程讀取時,就不能保證了。您需要自己做相應的處理)

多個線程可以讀一個變量,只有一個線程可以對這個變量進行寫,到底要不要加鎖?

下面簡要解釋一下原因:

鎖定是因為操作不是原子的。讓我們把我的手術作為一個解釋。參見下面兩個圖。

我這個操作需要

看上面的第二個圖,你能很清楚地理解這個過程嗎?

鎖定是為了確保上述三個步驟是原子操作。

回到問題上來,只有一個線程要寫,沒有競爭,所以不需要鎖定。

但是,如果你看第一張圖片,因為主內存和本地內存的存在

在一個線程寫入后,其他線程無法立即看到它。這就是可見性問題。

添加volatile關鍵字后,它將在操作后強制工作內存和主內存同步,以確保其他線程可以立即看到它。

volatile關鍵字在Java中有什么作用?

Volatile是為了防止指令重新排序以確保可見性

對于JVM級別,是為了防止編譯器重新排序

同時,對于某些CPU,它們會通過緩存鎖或線程來解決緩存可見性

但是,目前很多CPU已經過優化,由于cache一致性MESI會帶來性能開銷,因此采用storebuffer機制進行異步處理,這種機制會導致指令的無序執行。這會導致可見性問題。

然后volatile將在CPU級別增加內存屏障,以解決由CPU無序執行引起的可見性問題

主站蜘蛛池模板: 醴陵市| 高清| 莲花县| 孟州市| 错那县| 榆社县| 广德县| 平遥县| 万载县| 牙克石市| 龙江县| 剑阁县| 盐池县| 台安县| 英吉沙县| 砚山县| 广安市| 梁平县| 荥阳市| 青川县| 延寿县| 丰城市| 城市| 永兴县| 沙河市| 海阳市| 聂荣县| 天祝| 克什克腾旗| 莱芜市| 青川县| 比如县| 丘北县| 三穗县| 景洪市| 诸城市| 东光县| 离岛区| 高密市| 扶风县| 朝阳市|