关于java变量的可见性问题-java开发java经验技巧

关于java变量的可见性问题-java开发java经验技巧

ID:28372776

大小:72.50 KB

页数:3页

时间:2018-12-09

关于java变量的可见性问题-java开发java经验技巧_第1页
关于java变量的可见性问题-java开发java经验技巧_第2页
关于java变量的可见性问题-java开发java经验技巧_第3页
资源描述:

《关于java变量的可见性问题-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、关于Java变量的可见性问题-编程开发技术关于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循环????????????}????????}).start0;9999}••••丿问:

6、为什么整个程序不会终止?为什么取消注释屮的任何一个代码块(1,2,3),程序才会终止?synchronized会强制刷新住内存的变量值到线程栈?sleep会干什么呢?涉及知识解释•volatile:此关键字保证了变量在线程的可见性,所有线程访问由volatile修饰的变量,都必须从主存中读取后操作,并在工作内存修改后立即写回主存,保证了其他线程的可见性,同样效果的关键字还有final。•synchronized:所有同步操作部必须保证1、原了性2、可见性,所以在同步块屮发生的变化会立马写回主存•sleep

7、:此方法只会IklllCPU执行吋间,并不会释放锁。问题分析Q1:为什么注释代码后程序不会终止?A1:因为booleanis=true的变量值被前面线程(简称线程A)加载到自己的工作内存,在后而的线程(简称线程B)改变booleanis=falseZ后不一定会立马写入主存(不过这道题中应该会马上写入主存,因为线程执行完is二false之后线程就要退出了),即使立马写入了主存后线程A也不一定马上load到工作内存中,所以程序一直不会终止?这个是我们大多数人想到的,但其实JVM针对现在的硬件水平已经做了很大程

8、度的优化,基本上很大程度的保障了工作内存和主内存的及时同步,相当于默认使用了volatile。但只是最大程度!在CPU资源一直被占用的时候,工作内存与主内存中间的同步,也就是变量的可见性就会不那么及吋!后面会验证结论。Q2:为什么取消注释中的任何一个代码块(1,2,3),程序才会终止?A2:行号为1、2的代码有一个共同特点,就是都涉及到了synchronized同步锁,那么是否像捉问作者猜想的那样synchronized会强制

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。