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