本文向大家分享的主要內(nèi)容是Java面試中一個常見的知識點:volatile關(guān)鍵字。本文詳細介紹了volatile關(guān)鍵字的方方面面,希望大家在閱讀過本文之后,能完美解決volatile關(guān)鍵字的相關(guān)問題。
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比古藺網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式古藺網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋古藺地區(qū)。費用合理售后完善,十載實體公司更值得信賴。在Java相關(guān)的崗位面試中,很多面試官都喜歡考察面試者對Java并發(fā)的了解程度,而以volatile關(guān)鍵字作為一個小的切入點,往往可以一問到底,把Java內(nèi)存模型(JMM),Java并發(fā)編程的一些特性都牽扯出來,深入地話還可以考察JVM底層實現(xiàn)以及操作系統(tǒng)的相關(guān)知識。 下面我們以一次假想的面試過程,來深入了解下volitile關(guān)鍵字吧!
面試官: Java并發(fā)這塊了解的怎么樣?說說你對volatile關(guān)鍵字的理解就我理解的而言,被volatile修飾的共享變量,就具有了以下兩點特性:
1.保證了不同線程對該變量操作的內(nèi)存可見性;
2.禁止指令重排序
這個聊起來可就多了,我還是從Java內(nèi)存模型說起吧。 Java虛擬機規(guī)范試圖定義一種Java內(nèi)存模型(JMM),來屏蔽掉各種硬件和操作系統(tǒng)的內(nèi)存訪問差異,讓Java程序在各種平臺上都能達到一致的內(nèi)存訪問效果。簡單來說,由于CPU執(zhí)行指令的速度是很快的,但是內(nèi)存訪問的速度就慢了很多,相差的不是一個數(shù)量級,所以搞處理器的那群大佬們又在CPU里加了好幾層高速緩存。 在Java內(nèi)存模型里,對上述的優(yōu)化又進行了一波抽象。JMM規(guī)定所有變量都是存在主存中的,類似于上面提到的普通內(nèi)存,每個線程又包含自己的工作內(nèi)存,方便理解就可以看成CPU上的寄存器或者高速緩存。所以線程的操作都是以工作內(nèi)存為主,它們只能訪問自己的工作內(nèi)存,且工作前后都要把值在同步回主內(nèi)存。 這么說得我自己都有些不清楚了,拿張紙畫一下:
在線程執(zhí)行時,首先會從主存中read變量值,再load到工作內(nèi)存中的副本中,然后再傳給處理器執(zhí)行,執(zhí)行完畢后再給工作內(nèi)存中的副本賦值,隨后工作內(nèi)存再把值傳回給主存,主存中的值才更新。 使用工作內(nèi)存和主存,雖然加快的速度,但是也帶來了一些問題。比如看下面一個例子:
i = i + 1;