關(guān)于java變量的可見性問題-java開發(fā)java經(jīng)驗(yàn)技巧

關(guān)于java變量的可見性問題-java開發(fā)java經(jīng)驗(yàn)技巧

ID:28372776

大?。?2.50 KB

頁數(shù):3頁

時(shí)間:2018-12-09

關(guān)于java變量的可見性問題-java開發(fā)java經(jīng)驗(yàn)技巧_第1頁
關(guān)于java變量的可見性問題-java開發(fā)java經(jīng)驗(yàn)技巧_第2頁
關(guān)于java變量的可見性問題-java開發(fā)java經(jīng)驗(yàn)技巧_第3頁
資源描述:

《關(guān)于java變量的可見性問題-java開發(fā)java經(jīng)驗(yàn)技巧》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。

1、關(guān)于Java變量的可見性問題-編程開發(fā)技術(shù)關(guān)于Java變量的可見性問題原文出處:Ambitor博文前提最近在oschina問答板塊看到了一個(gè)關(guān)于java變量在工作內(nèi)存和主存中的可見性問題:synchorized,sleep也能達(dá)到volatile線程可見性的目的?,大致的問題描述如下:package?com.test;import?java?uti1.concurrent.TimcUnit;public?class?testl?{????private?static?boolean?is?二?true;?

2、???public?static?void?main(String[]?args)?{????????new?Thread(new?Runnable()?{????????????@0verride????????????public?void?run()?{????????????????int?i?=?0;????????????????whilc(tcstl.is){???????????????????i++;???????????????????1?//synchronized?(this)?{

3、?}?會(huì)強(qiáng)制刷新主內(nèi)存的變量值到線程棧????????????????????2?//System.out.printin(〃1〃);?println?是synchronized?的,會(huì)強(qiáng)制刷新主內(nèi)存的變量值到線程棧????????????????????3?//sleep?會(huì)從新load主內(nèi)存的值???????????????????????//????try?{?????????????????????//???????TimcUnit.MICROSECONDS,slccp(l);??????????

4、???????????//???}catch?(lnterruptedException?e)?{?????????????????????//??????e.printStackTraceO;??????????????????????//???}????????????????}?????????????}????????}).start();?????????try?{????????????TimeUnit.SECONDS,sleep(l);????????????}?catch?(Tnterru

5、ptedException?e)?{????????????????e.printStackTraceO;??????????????}????????new?Thread(new?Runnable()?{????????????@0verride????????????public?void?run()?{????????????????is?=?false;??//設(shè)置is為false,使上而的線程結(jié)束while循環(huán)????????????}????????}).start0;9999}????丿問:

6、為什么整個(gè)程序不會(huì)終止?為什么取消注釋屮的任何一個(gè)代碼塊(1,2,3),程序才會(huì)終止?synchronized會(huì)強(qiáng)制刷新住內(nèi)存的變量值到線程棧?sleep會(huì)干什么呢?涉及知識(shí)解釋?volatile:此關(guān)鍵字保證了變量在線程的可見性,所有線程訪問由volatile修飾的變量,都必須從主存中讀取后操作,并在工作內(nèi)存修改后立即寫回主存,保證了其他線程的可見性,同樣效果的關(guān)鍵字還有final。?synchronized:所有同步操作部必須保證1、原了性2、可見性,所以在同步塊屮發(fā)生的變化會(huì)立馬寫回主存?sleep

7、:此方法只會(huì)IklllCPU執(zhí)行吋間,并不會(huì)釋放鎖。問題分析Q1:為什么注釋代碼后程序不會(huì)終止?A1:因?yàn)閎ooleanis=true的變量值被前面線程(簡稱線程A)加載到自己的工作內(nèi)存,在后而的線程(簡稱線程B)改變booleanis=falseZ后不一定會(huì)立馬寫入主存(不過這道題中應(yīng)該會(huì)馬上寫入主存,因?yàn)榫€程執(zhí)行完is二false之后線程就要退出了),即使立馬寫入了主存后線程A也不一定馬上load到工作內(nèi)存中,所以程序一直不會(huì)終止?這個(gè)是我們大多數(shù)人想到的,但其實(shí)JVM針對現(xiàn)在的硬件水平已經(jīng)做了很大程

8、度的優(yōu)化,基本上很大程度的保障了工作內(nèi)存和主內(nèi)存的及時(shí)同步,相當(dāng)于默認(rèn)使用了volatile。但只是最大程度!在CPU資源一直被占用的時(shí)候,工作內(nèi)存與主內(nèi)存中間的同步,也就是變量的可見性就會(huì)不那么及吋!后面會(huì)驗(yàn)證結(jié)論。Q2:為什么取消注釋中的任何一個(gè)代碼塊(1,2,3),程序才會(huì)終止?A2:行號(hào)為1、2的代碼有一個(gè)共同特點(diǎn),就是都涉及到了synchronized同步鎖,那么是否像捉問作者猜想的那樣synchronized會(huì)強(qiáng)制

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時(shí)聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。