java线程变量修饰符_Java的 volatile易变量成员修饰符

版本

命令行

Volatile是否有用

JDK 1.2

Java Volatile

JDK 1.2

Java –Djava.compiler=NONE Volatile

JDK 1.1

Java Volatile

JDK 1.1

Java –nojit Volatile

JDK 1.0

Java Volatile

Sun在VM中包含JIT之前,使用volatile无差异。另外,甚至包含JIT后,每个线程进入或离开同步块,它都会让变量的私有拷贝与共享拷贝一致。Synchronized代码块分布在java.*类库中,因此,开发人员可能没有意识到私有拷贝已经被校准了。例如,Systme.out.println()包含一个synchronized块,所以,在Volatile中使用它打印当前value,保持私有变量为最新值,volatile修饰符似乎没有发挥作用。许多开发人员编写过在一些成员变量上应用了volatile修饰符的代码。但是至少因为以上其中一个原因,volatile不能产生关键性的区别。

Volatile修饰符的存在要求VM总是访问变量的共享拷贝。与VM通过保存一份私有拷贝来执行优化相比,它的效率要低。只在必要时使用volatile,滥用volatile会导致不必要地降低应用程序的执行速度。

小技巧:

在两个或更多线程访问的成员变量上使用volatile时,除非所有的线程都访问synchronized代码块内的变量。如果成员变量构建后保持为常量(即只读),就没有必要声明为volatile。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值