a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 141|回复: 0

[基础知识] JAVA基础:什么是Java的volatile

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
 我们知道,在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有需要进行同步。   这在JVM 1.2之前,Java的内存模子实现老是从主存篡夺变量,是不需要进行出格的注重的。而跟着JVM的成熟和优化,此刻在多线程情形下volatile关头字的使用变得很是主要。$ x3 u* n; I0 O# x$ y0 ^' G
  在当前的Java内存模子下,线程可以把变量保留在当地内存(好比机械的寄放器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中改削了一个变量的值,而此吐矣闽线程还继续使用它在寄放器中的变量值的拷贝,造成数据的纷歧致。6 n! \, \+ C* g1 v4 L
  要解决这个问题,只需要像在本轨范中的这样,把该变量声明为volatile(不不变的)即可,这就指示JVM,这个变量是不不变的,每次使用它都到主存中进行篡夺。一般说来,多使命情形下各使命间共享的标识表记标帜都应该加volatile润色。2 _8 `7 p% l2 G- }5 ?
  Volatile润色的成员变量在每次被线程访谒时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生转变时,强迫线程将转变值回写到共享内存。这样在任何时刻,两个分歧的线程老是看到某个成员变量的统一个值。9 m. R- r5 X$ u+ A
  Java说话规范中指出:为了获得最佳速度,许可线程保留共享成员变量的私有拷贝,而且只当线程进入或者分开同步代码块时才与共享成员变量的原始值对比。6 e" \  o- f2 P0 y. O) n
  这样当多个线程同时与某个对象交互时,就必需要注重到要让线程实时的获得共享成员变量的转变。, q" A" A2 k* k/ u: V& U; r: b+ W
  而volatile关头字就是提醒VM:对于这个成员变量不能保留它的私有拷贝,而应直接与共享成员变量交互。  c# [- }7 E5 Z& G- V" P
  使用建议:在两个或者更多的线程访谒的成员变量上使用volatile。当要访谒的变量已在synchronized代码块中,或者为常量时,不必使用。
: c7 t+ H  K/ A9 @, e) \2 c3 n  因为使用volatile屏障失踪了VM中需要的代码优化,所以在效率上斗劲低,是以必然在需要时才使用此关头字。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-15 13:40 , Processed in 0.219146 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表