`
darrenzhu
  • 浏览: 804521 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java Volatile学习

阅读更多
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 关键字 学习

    【Java面试题】volatile的作用

    【Java面试题】volatile的作用

    java自主学习课件

    6. **线程与并发**:Java 对多线程提供了强大的支持,课程会讲解如何创建和管理线程,以及同步机制如 synchronized 关键字和 volatile 变量,确保多线程环境下的数据一致性。 7. **Java 核心类库**:如 Math 类、...

    JAVA系统学习PPT资料

    同时,Java的并发编程模型,如synchronized关键字、volatile、线程池(ExecutorService)等,是多线程应用开发的基础,掌握这些能让你编写出高效且线程安全的代码。 此外,Java SE还包含了一些高级特性,如反射、...

    Java并发volatile可见性的验证实现

    Java并发volatile可见性的验证实现 在Java并发编程中,volatile关键字扮演着非常重要的角色,它可以确保变量的...本文通过示例代码详细介绍了Java并发volatile可见性的验证实现,希望对读者的学习和工作具有参考价值。

    java深入学习就靠他了

    4. **多线程**:Java提供了内置的多线程支持,使得开发者可以编写并发应用程序,这是理解和使用synchronized、volatile关键字,以及Thread和Runnable接口的关键。 5. **IO流**:Java的IO库提供了处理输入和输出的...

    Java虚拟机学习资料

    以下是对"深入理解Java虚拟机学习资料"的详细解析: 一、JVM概述 Java虚拟机是Java平台的核心组成部分,它负责加载、验证、执行Java字节码,并管理内存。JVM的设计目标是实现“一次编写,到处运行”。通过JVM,Java...

    Java线程学习和总结

    在Java编程语言中,线程是程序执行的基本单元,它允许程序并发地...同时,"Java线程学习和总结.files"目录下的文件可能是与文章相关的辅助资料,例如代码示例或图片。建议结合这些资料一起学习,以获得更全面的知识。

    Java学习练习题

    学习者需要了解线程的创建方式(如实现Runnable接口或继承Thread类),掌握线程同步机制(如synchronized关键字、Lock接口、volatile关键字),以及如何使用线程池来管理和调度线程,以提高系统性能。 最后,Java的...

    java虚拟机学习

    学习Java虚拟机对于深入理解Java程序的执行机制至关重要。这里我们将深入探讨Java虚拟机的几个关键知识点。 1. 类加载机制:Java程序的执行始于类加载。JVM有三个主要的类加载器——bootstrap classloader、...

    volatile学习手册

    《volatile学习手册》 在Java编程中,volatile关键字是一个重要的工具,它提供了轻量级的同步机制,确保了多线程环境下的数据可见性,但并不保证原子性。本文将深入探讨volatile的关键特性、作用机制以及如何在实际...

    深入探讨Java多线程中的volatile变量共6页.pd

    Java多线程编程是开发高并发应用的关键技术之一,而volatile关键字在其中扮演着至关重要的角色。本资料《深入探讨Java多线程中的volatile变量》将带你深入理解这个概念,全面解析其工作原理和实际应用。 volatile...

    初见volatile.md,学习代码

    在Java编程语言中,`volatile`关键字是一个非常重要的概念,特别是在多线程环境下。标题“初见volatile.md”和描述“4 初见volatile.md”表明我们将深入理解这个关键字的作用和意义。 `volatile`关键字主要解决的是...

    Java线程 学习

    ### Java线程学习知识点 #### 一、Java线程概览 - **定义与作用**:线程是在程序中独立且并发执行的路径。在Java中,线程被设计为语言的一部分,而不是作为操作系统的底层工具。每个Java程序至少包含一个主线程,在...

    Java Java程序设计 Java学习文档 Java语言

    6. **线程与并发**:理解多线程的概念,如何在Java中创建和管理线程,以及同步和互斥的概念,如synchronized关键字和volatile变量。 7. **反射与注解**:了解Java反射机制,用于在运行时获取类的信息并动态调用方法...

    JAVA多线程学习内容

    总的来说,Java多线程学习涵盖了线程的创建、同步、通信、调度以及异常处理等多个方面,深入理解和掌握这些知识点对于提升Java程序的性能和复杂性至关重要。通过阅读提供的"Java多线程.pdf"文档,你可以进一步了解和...

    java学习资料.zip

    "java学习资料.zip"包含了两本经典书籍的中文版本:《Effective Java》的第一版和第二版,这些都是Java开发者深入理解语言特性和最佳实践的重要资源。 《Effective Java》是由Joshua Bloch编写的,他是一位经验丰富...

    学习Java多线程之volatile域

    Java多线程中的volatile关键字是Java提供的一个较弱的同步机制,用于解决多线程环境下的数据一致性问题。volatile确保了变量在多个线程之间的可见性,并限制了指令重排序,但并不保证原子性。 首先,理解Java内存...

    java虚拟机学习文档 java8.rar

    深入学习JVM不仅能够帮助我们编写更高效的Java代码,还能让我们在遇到性能问题时能迅速定位并解决,是每一位Java开发者的必备技能。通过阅读《Java® Virtual Machine Specification Java SE 8 Edition》这份文档,...

Global site tag (gtag.js) - Google Analytics