Volatile
Volatile的英文解释:adj.易变的,不稳定的.
工作内存Working Memory: 线程私有空间,在虚拟机栈内存里面,由每个线程独享。
主内存Main Memory: 多个线程共享,在堆内存里面。
对于Volatile类型的变量来说,上一次写入操作的结果对下一次读取操作是肯定可见的。在写入volatile变量值之后,CPU缓存中的内容会被写回主存,在读取volatile变量时,CPU缓存中的对应内容被设置为失效状态,重新从主存中进行读取。将变量声明为volatile相当于为单个变量的读取和写入添加了同步操作。但是volatile在使用时不需要利用锁机制,因此性能要由于synchronized关键词。
public class Worker {
private volatile boolean done;
public void setDone(boolean done) {
this.done = done;
}
public void work() {
while (!done) {
//do something
}
}
}
对于上面的例子,当线程A调用lWorker类的对象的work方法,开始执行具体的任务。在适当的时候线程B会调用同一Work类的对象的setDone方法来声明终止任务的执行。把done变量声明为volatile是很重要的。只有这样才能保证线程B对done变量所做的修改对线程A的后续操作是可见的。否则,线程A可能由于无法看到done变量值的变化而一直运行下去。
但是虽然volatile关键词使用简单,但是由于在实现时没有锁机制的存在,volatile关键词的适用场景是受限的。比如对于下面的例子:
public class IdGenerator {
private int value = 0;
public int getNext() {
return value++;
}
}
注释: 虽然getNext方法只有一行代码,但是这一行代码对应的字节码指令却是7条。
如果只是把value声明为volatile是不够的,仍然会出现问题。这是因为写入的value的正确值依赖于value的当前值,而当前值有可能是不正确的。假设线程A获取了value的当前值1却发生了线程切换,如果线程B把value改成2后,线程A才获得了执行,这个时候A所持有的当前值1就已经不是正确的了。当要写入的新值与当前值没有关系时,使用volatile就足够了。
原子操作:
在Java中,对于非long型和double型的域的读取和写入操作是原子操作。对象引用的读取和写入操作也是原子操作。比如读取一个int型的域时,该域对应的内存地址中的32位的内容会被完整读取,在读取过程中不会被其他线程所打断。在写入操作时也不会被打断。在写入非volatile的long型和double型的域的值时,分成两次操作来完成。一个long型或double型的域的长度是64位,每次写入32位。在一个线程写入了long型或double型的域的前32位之后,在写入后32位之前,另外一个线程有可能访问这个域的值,从而读取只完成部分写入操作的错误值。因此在多线程程序中使用long型和double型的共享变量时,需要把变量声明为volatile,以保证读取和写入的完整性。
另外注意这里说的类型时基本类型,并不是封装类型,封装类型事实上是object.
可见性:
分享到:
相关推荐
java volatile 关键字 学习
【Java面试题】volatile的作用
6. **线程与并发**:Java 对多线程提供了强大的支持,课程会讲解如何创建和管理线程,以及同步机制如 synchronized 关键字和 volatile 变量,确保多线程环境下的数据一致性。 7. **Java 核心类库**:如 Math 类、...
同时,Java的并发编程模型,如synchronized关键字、volatile、线程池(ExecutorService)等,是多线程应用开发的基础,掌握这些能让你编写出高效且线程安全的代码。 此外,Java SE还包含了一些高级特性,如反射、...
Java并发volatile可见性的验证实现 在Java并发编程中,volatile关键字扮演着非常重要的角色,它可以确保变量的...本文通过示例代码详细介绍了Java并发volatile可见性的验证实现,希望对读者的学习和工作具有参考价值。
4. **多线程**:Java提供了内置的多线程支持,使得开发者可以编写并发应用程序,这是理解和使用synchronized、volatile关键字,以及Thread和Runnable接口的关键。 5. **IO流**:Java的IO库提供了处理输入和输出的...
以下是对"深入理解Java虚拟机学习资料"的详细解析: 一、JVM概述 Java虚拟机是Java平台的核心组成部分,它负责加载、验证、执行Java字节码,并管理内存。JVM的设计目标是实现“一次编写,到处运行”。通过JVM,Java...
在Java编程语言中,线程是程序执行的基本单元,它允许程序并发地...同时,"Java线程学习和总结.files"目录下的文件可能是与文章相关的辅助资料,例如代码示例或图片。建议结合这些资料一起学习,以获得更全面的知识。
学习者需要了解线程的创建方式(如实现Runnable接口或继承Thread类),掌握线程同步机制(如synchronized关键字、Lock接口、volatile关键字),以及如何使用线程池来管理和调度线程,以提高系统性能。 最后,Java的...
学习Java虚拟机对于深入理解Java程序的执行机制至关重要。这里我们将深入探讨Java虚拟机的几个关键知识点。 1. 类加载机制:Java程序的执行始于类加载。JVM有三个主要的类加载器——bootstrap classloader、...
《volatile学习手册》 在Java编程中,volatile关键字是一个重要的工具,它提供了轻量级的同步机制,确保了多线程环境下的数据可见性,但并不保证原子性。本文将深入探讨volatile的关键特性、作用机制以及如何在实际...
Java多线程编程是开发高并发应用的关键技术之一,而volatile关键字在其中扮演着至关重要的角色。本资料《深入探讨Java多线程中的volatile变量》将带你深入理解这个概念,全面解析其工作原理和实际应用。 volatile...
在Java编程语言中,`volatile`关键字是一个非常重要的概念,特别是在多线程环境下。标题“初见volatile.md”和描述“4 初见volatile.md”表明我们将深入理解这个关键字的作用和意义。 `volatile`关键字主要解决的是...
### Java线程学习知识点 #### 一、Java线程概览 - **定义与作用**:线程是在程序中独立且并发执行的路径。在Java中,线程被设计为语言的一部分,而不是作为操作系统的底层工具。每个Java程序至少包含一个主线程,在...
6. **线程与并发**:理解多线程的概念,如何在Java中创建和管理线程,以及同步和互斥的概念,如synchronized关键字和volatile变量。 7. **反射与注解**:了解Java反射机制,用于在运行时获取类的信息并动态调用方法...
总的来说,Java多线程学习涵盖了线程的创建、同步、通信、调度以及异常处理等多个方面,深入理解和掌握这些知识点对于提升Java程序的性能和复杂性至关重要。通过阅读提供的"Java多线程.pdf"文档,你可以进一步了解和...
"java学习资料.zip"包含了两本经典书籍的中文版本:《Effective Java》的第一版和第二版,这些都是Java开发者深入理解语言特性和最佳实践的重要资源。 《Effective Java》是由Joshua Bloch编写的,他是一位经验丰富...
Java多线程中的volatile关键字是Java提供的一个较弱的同步机制,用于解决多线程环境下的数据一致性问题。volatile确保了变量在多个线程之间的可见性,并限制了指令重排序,但并不保证原子性。 首先,理解Java内存...
深入学习JVM不仅能够帮助我们编写更高效的Java代码,还能让我们在遇到性能问题时能迅速定位并解决,是每一位Java开发者的必备技能。通过阅读《Java® Virtual Machine Specification Java SE 8 Edition》这份文档,...