關于java變量的可見性問題-java開發(fā)java經驗技巧

關于java變量的可見性問題-java開發(fā)java經驗技巧

ID:28372776

大小:72.50 KB

頁數(shù):3頁

時間:2018-12-09

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

《關于java變量的可見性問題-java開發(fā)java經驗技巧》由會員上傳分享,免費在線閱讀,更多相關內容在學術論文-天天文庫

1、關于Java變量的可見性問題-編程開發(fā)技術關于Java變量的可見性問題原文出處:Ambitor博文前提最近在oschina問答板塊看到了一個關于java變量在工作內存和主存中的可見性問題:synchorized,sleep也能達到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、?}?會強制刷新主內存的變量值到線程棧????????????????????2?//System.out.printin(〃1〃);?println?是synchronized?的,會強制刷新主內存的變量值到線程棧????????????????????3?//sleep?會從新load主內存的值???????????????????????//????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;??//設置is為false,使上而的線程結束while循環(huán)????????????}????????}).start0;9999}????丿問:

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

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

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

當前文檔最多預覽五頁,下載文檔查看全文

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

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