java并发编程(5):volatile变量修饰符—意料之外的问题(含代码)-编程开发技术

java并发编程(5):volatile变量修饰符—意料之外的问题(含代码)-编程开发技术

ID:30779998

大小:108.35 KB

页数:6页

时间:2019-01-03

java并发编程(5):volatile变量修饰符—意料之外的问题(含代码)-编程开发技术_第1页
java并发编程(5):volatile变量修饰符—意料之外的问题(含代码)-编程开发技术_第2页
java并发编程(5):volatile变量修饰符—意料之外的问题(含代码)-编程开发技术_第3页
java并发编程(5):volatile变量修饰符—意料之外的问题(含代码)-编程开发技术_第4页
java并发编程(5):volatile变量修饰符—意料之外的问题(含代码)-编程开发技术_第5页
资源描述:

《java并发编程(5):volatile变量修饰符—意料之外的问题(含代码)-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、hva并发编程(5):volatile变屋修饰符一意料Z外的问题(含代码)-编程开发技术Java并发编程(5):volatile变量修饰符一意料之外的问题(含代码)原文岀处:兰亭风雨volatile用处说明???在JDK1.2之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程坏境下volatile关键字的使用变得非常重要。在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)小,而不是直接在主存中进行读写。这就可能造成一个

2、线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。要解决这个问题,就需要把变呆声明为volatile(也可以使用同步,参见http://blog.csdn.net/ns_code/article/details/!7288243),这就指示JVM,这个变量是不稳定的,每次使用它都到主存屮进行读取。一般说来,多任务环境下,各任务间共享的变量都应该加volatile修饰符。Volatile修饰的成员变量在每次被线程访问时,都强迫从共亨内存屮重读该成员变量的值。而J1,当成

3、员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。Java语言规范屮指出:为了获得最佳速度,允许线程保存共亨成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才将私有拷贝与共享内存中的原始值进行比较。这样当多个线程同时与某个对象交互时,就必须注意到要让线程及时的得到共亨成员变量的变化。Ifljvolatile关键字就是提示JVM:对于这个成员变量,不能保存它的私有拷贝,而应直接与共享成员变量交互。volatile是-种稍弱的同步机制,在访问volati

4、le变量时不会执行加锁操作,也就不会执行线程阻塞,因此volatilei变量是一种比synchronized关键?更轻量级的同步机制。使川建议:在两个或者更多的线程需要访问的成员变量上使川volatileo当要访问的变量已在synchronized代码块屮,或者为常量时,没必要使用volatile□由于使用volatile屏蔽掉了JVM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。示例程序下面给出一段代码,通过其运行结果來说明使用关键字volatile产生的差异,但实际上遇到了意料之外的问题:p

5、ublicclassVolatileextendsObjectimplementsRunnable{//value变量没冇被标记为volatileprivateintvalue;//missedlt变量被标记为volatileprivatevolatilebooleanmissedlt;//crcationTimc不需耍声明为volatile,因为代码执行中它没有发生变化privatelongcreationTiine;publicVolatile(){value=10;missedlt=false;//获取当前时间,

6、亦即调用Volatile构造函数时的时间creationTime二System,currentTimeM订lis();}publicvoidrun(){print(''enteringrun()z,);//循环检查value的值是否不同while(value<20){//如果missedlt的值被修改为true,则通过break退出循环if(missedIt){//进入同步代码块前,将value的值赋给currValucintcurrValue=value;//在一个任意对象上执行同步语句,目的是为了让该线程在进入和离

7、开同步代码块吋,//将该线程中的所冇变量的私冇拷贝与共享内存中的原始值进行比较,//从而发现没冇用volatile标记的变量所发生的变化Objectlock二newObject();synchronized(lock){//不做任何事}//离开同步代码块后,将此时value的值赋给valueAfterSyncintvalueAfterSync二value;print(〃inrun()-secvalue二"+currValuc+〃,butrumorhasitthatitchanged!,z);print(z,inrun(

8、)-valueAfterSync=z,+valueAfterSync);break;print(/zleavingrun()z/);publicvoidworkMethod()throwsInterruptedException{print(''enteringworkMethod()/z);print(〃inworkMethod

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

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

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