本文為大家介紹volatile關鍵字的作用之一不讓編譯器優(yōu)化(c volatile關鍵字的作用),下面和小編一起看看詳細內容吧。
volatile 通常用于java 并發(fā)編程,以保持內存可見性并防止指令重新排序。內存可見性(memory visibility):所有線程都能看到共享內存的最新狀態(tài);防止指令重排:在基于偏序關系的happens-before內存模型中,指令重排技術極大地提高了程序執(zhí)行效率,但也引入了一些問題。
volatile 有維護內存可見性的特殊規(guī)則:讀取、加載和使用操作必須連續(xù)發(fā)生;分配、存儲和寫入操作必須連續(xù)發(fā)生;每次讀取前必須從主存中刷新最新值;立即同步回主內存。
也就是說,被volatile關鍵字修飾的變量,隨時看到它的最新值。線程1 中變量v 的最新修改對線程2 可見。
volatile防止指令重排策略:在每個volatile寫操作前插入一個storestore屏障;在每次易失性寫入操作后插入一個storeload 屏障;在每個易失性讀取操作之后插入一個loadload 屏障;在每個易失性讀取操作之后插入一個loadload 屏障;在易失性讀取操作之后插入一個loadstore 屏障。
注意:這樣的指令重排序問題只發(fā)生在happens-before 內存模型中。
好了,volatile關鍵字的作用之一不讓編譯器優(yōu)化(c volatile關鍵字的作用)的介紹到這里就結束了,想知道更多相關資料可以收藏我們的網站。