Java Volatile keyword】的更多相关文章

Volatile修饰的成员变量在每次被线程訪问时,都强迫从主内存中重读该成员变量的值.并且,当成员变量发生变化时,强迫线程将变化值回写到主内存.这样在不论什么时刻,两个不同的线程总是看到某个成员变量的同一个值.    Java语言规范中指出:为了获得最佳速度,同意线程保存共享成员变量的私有拷贝,并且仅仅当线程进入或者离开同步代码块时才与共享成员变量的原始值对照.    这样当多个线程同一时候与某个对象交互时.就必需要注意到要让线程及时的得到共享成员变量的变化.    而volatilekeywo…
[Java并发编程(三)] Java volatile 关键字介绍 摘要 Java volatile 关键字是用来标记 Java 变量,并表示变量 "存储于主内存中" .更准确的说就是对于 volatile 变量的每次读操作都是从计算机的主内存中读取,而不是 CPU 缓存,每次写操作也是将 volatile 变量写入主内存中,不是 CPU 缓存. 事实上,因为 Java 5 的 volatile 关键字保证的不止是从主内存读写.这点稍后会进行解释. 正文 Java volatile 可…
在网上看到很多关于 volatile 关键字的说明和使用问题, 今天引用Java Threads中的解释,感觉全面而详细,可惜是英文的. 这里很清晰的揭示了volatile 本身并不处理java读取数据的原子性问题,而是强制线程对数据的读写必须及时反映到主内存. 以下说明了volatile时, 其不能用于 long 和double 类型数据的根本和直接原因,其他很多解释都犯了概念性的错误. 其他原子类型数据的loading 和storing的原子性是由Java语言自身定义的,并不是由volati…
网上关于java volatile的资料已经不少了,但搜了好久也没看到谁用代码很好地验证过使不使用volatile的差异.最近自己写了个测试,意外的看到了两者的明显区别,为什么说意外呢,因为根据我的测试,在32位的JVM(以下均指oracle官方的JVM)上是看不出差异的,也就是说32位的JVM上,不会发生因为没使用volatile而引起的多个线程读写公共变量不同步问题(有误,见末尾的补充),偶然在64位的JVM上跑了下,问题一下出现了.我一直是用32位的JVM做测试,一直把问题的不出现归结于概…
[Java并发编程(五)] Java volatile 的实现原理 简介 在多线程并发编程中 synchronized 和 volatile 都扮演着重要的角色,volatile 是轻量级的 synchronized,它在多处理器开发中保证了共享变量的"可见性".可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值.它在某些情况下比synchronized 的开销更小,本文将深入分析在硬件层面上 Intel 处理器是如何实现 volatile 的,通过深入分析能帮…
[Java并发编程(四)] Java volatile 的理论实践 摘要 Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分.本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形. 锁提供了两种主要特性: 互斥(mutual…
以下内容转自http://tutorials.jenkov.com/java-concurrency/volatile.html(使用谷歌翻译): Java volatile关键字用于将Java变量标记为“存储在主存储器”中.更准确地说,这意味着,每个读取volatile变量将从计算机的主存储器中读取,而不是从CPU缓存中读取,并且每个写入volatile变量的写入将被写入主存储器,而不仅仅是写入CPU缓存. 实际上,由于Java 5的volatile关键字保证不仅仅是volatile变量被写入…
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变量,都应该从主存读取,而不是从CPU缓存读取.每次写入一个volatile变量,应该写到主存中,而不是仅仅写到CPU缓存. 实际上,从Java 5开始,volatile关键字除了保证volatile变量从主存读写外,还提供了更多的保障.我将在后面的章节中进行说明. 变量可见性问题 Java的volatile关键字能保证变量修改后,对各个线程是可见的…
本文转载自Java volatile 关键字底层实现原理解析 导语 在Java多线程并发编程中,volatile关键词扮演着重要角色,它是轻量级的synchronized,在多处理器开发中保证了共享变量的"可见性"."可见性"的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值.如果一个字段被声明为volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的.与synchronized不同,volatile变量不会引起线程上下文的切换和…