Java Volatile keyword

Volatile修饰的成员变量在每次被线程訪问时,都强迫从主内存中重读该成员变量的值。并且,当成员变量发生变化时,强迫线程将变化值回写到主内存。这样在不论什么时刻,两个不同的线程总是看到某个成员变量的同一个值。

Java语言规范中指出:为了获得最佳速度,同意线程保存共享成员变量的私有拷贝,并且仅仅当线程进入或者离开同步代码块时才与共享成员变量的原始值对照。

这样当多个线程同一时候与某个对象交互时。就必需要注意到要让线程及时的得到共享成员变量的变化。

而volatilekeyword就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。

使用建议:在两个或者很多其它的线程訪问的成员变量上使用volatile。

当要訪问的变量已在synchronized代码块中。或者为常量时。不必使用。

因为使用volatile屏蔽掉了VM中必要的代码优化。所以在效率上比較低,因此一定在必要时才使用此keyword。

时间: 2024-10-13 12:03:14

Java Volatile keyword的相关文章

Java's Volatile Keyword

转自 http://tutorials.jenkov.com/java-concurrency/volatile.html The Java volatile keyword is used to mark a Java variable as "being stored in main memory". More precisely that means, that every read of a volatile variable will be read from the com

13、Java并发性和多线程-Java Volatile关键字

以下内容转自http://tutorials.jenkov.com/java-concurrency/volatile.html(使用谷歌翻译): Java volatile关键字用于将Java变量标记为“存储在主存储器”中.更准确地说,这意味着,每个读取volatile变量将从计算机的主存储器中读取,而不是从CPU缓存中读取,并且每个写入volatile变量的写入将被写入主存储器,而不仅仅是写入CPU缓存. 实际上,由于Java 5的volatile关键字保证不仅仅是volatile变量被写入

Java volatile关键字简读

Java volatile关键字解读-多变的,易变的 volatile访问内存内存模型: - 1.常用变量是由主内存加载到缓存,线程进一步获取变量内容. - 2.volatile每次访问直接访问主内存cpu,保证缓存一致性,实现轻量级同步 Demo public class VolatileDemo { private static volatile boolean flag = false; public static void main(String[] args){ Thread thre

【笔试题】Java final keyword

Java 知识测试 Java final keyword Question 1 What is the use of final keyword in Java? A. When a class is made final, a sublcass of it can not be created. B. When a method is final, it can not be overridden. C. When a variable is final, it can be assigned

Java volatile 关键字 理解

Java   volatile 理解 Volatile 1 如果一个字段被申明为volatile,那么Java内存模型则可以保证多个线程所看到的值是一致的. 2  禁止指定重排. 3  volatile只能保证可见性,不能保证原子性 可见性实现原理: volatile能够保证可见性,那么它是如何实现可见性的呢?以X86处理器为例,在对volatile修饰的变量进行写操作时,通过编译器生成反汇编指令后,会发现会多一条Lock前缀,就是由于这条Lock前缀所实现的可见性.Lock前缀在多核处理器中会

Java volatile 关键字

前言: 用在多线程,同步变量.线程为了提高效率,将某个成员(A)变量拷贝了一份(B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不 一致的情况.volatile就是用来避免这个中情况的.volatile告诉jvm,它所修饰的变量不保留拷贝,直接访问主内存中的A.在Java内存模型中,有main memory,每个线程也 有自己的memory(寄存器).为了性能,一个线程会在自己的memory中保持要访问的变量的副本.这样就会出现同一个变量在某个瞬时,在一个线

Java Volatile transient 关键字

随笔-204  评论-134  文章-0  trackbacks-0 Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到主内存.这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值.     Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比.     这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及

java volatile关键字的理解

转载:http://shmilyaw-hotmail-com.iteye.com/blog/1672779 一个多线程的示例引发的问题 在讨论这个关键字之前先看一个多线程的示例代码: Java代码   public class RaceCondition { private static boolean done; public static void main(final String[] args) throws InterruptedException{ new Thread( new R

深入分析 Java volatile 变量

1.Java内存模型(Java Memory Model) Java内存模型(JMM),不同于Java运行时数据区,JMM的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中读取数据这样的底层细节.JMM规定了所有的变量都存储在主内存中,但每个线程还有自己的工作内存(CPU内存),线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝.线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量,工作内存是线程之间独立的,线程之间变量值的传递均需要通过