volatile修飾符會(huì)破壞jvm優(yōu)化么

effective java第66條,同步訪問共享變量的一個(gè)例子
例如

public class VolatileTest {
    private static boolean testBool;

    public static void main(String[] args) throws InterruptedException {
        Thread test = new Thread(new Runnable(){
            public void run(){
                int i = 0;
                while(!testBool){
                    i++;
                }
            }
        });
        
        test.start();
        TimeUnit.SECONDS.sleep(1);
        testBool = true;

    }

}

書中說虛擬機(jī)會(huì)將代碼優(yōu)化hoisting

if(!testBool){
  while(true) i++
}

而導(dǎo)致該進(jìn)程操作無法停止

可以使用sync關(guān)鍵字同步讀寫testBool變量,從而達(dá)想要的通信效果

也可以使用volatile修飾符修飾testBool,該修飾符會(huì)強(qiáng)制線程復(fù)制的共享變量值一直為共享池中的最新值。
但是如果JVM仍然進(jìn)行hoisting優(yōu)化,效果應(yīng)該是不正確的。而實(shí)際效果是正確的??赡苁莢olatile修飾符強(qiáng)行終止了JVM優(yōu)化。
volatile并不能實(shí)現(xiàn)同步互斥,只是讓線程一直獲取最新的共享內(nèi)容,只能保證對單次讀/寫的原子性,像i++這種操作是讀和寫兩次操作,讀取i,對i+1,寫入i。

測試發(fā)現(xiàn),在i++后執(zhí)行一個(gè)System.out.println("i" + i);內(nèi)容也會(huì)發(fā)生VM沒有進(jìn)行優(yōu)化操作,代碼在主線程執(zhí)行完賦值就終止了。
而且翻閱網(wǎng)絡(luò)上的文章,發(fā)現(xiàn)VM使用client模式也不會(huì)復(fù)現(xiàn)優(yōu)化后的場景,只有server模式VM才可以復(fù)現(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,847評論 11 349
  • 1. 仿寫汪增祺《八千歲》中的一段話,表達(dá)自己的某一種濃烈的情感。 “前頭”沒有什么事的時(shí)候,他就到后面看看。進(jìn)了...
    簡單369閱讀 348評論 1 0
  • 走出混沌的方法就是問自己有個(gè)什么理由、求個(gè)什么結(jié)果。 已然的事不能成未然,未然的事尚能把握在自己手中。 求什么結(jié)果...
    君心向水royal閱讀 668評論 0 0
  • 在人生前半程,我覺得我的命運(yùn)是傻乎乎的過,為了一個(gè)個(gè)不喜歡自己的人喝醉過,也為了一個(gè)不喜歡自己的人努力過,努力活成...
    米奇小姑娘閱讀 393評論 0 0

友情鏈接更多精彩內(nèi)容