`
darrenzhu
  • 浏览: 783390 次
  • 性别: 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 volatile关键字作用及使用场景详解

    在本文里我们给大家分享的是关于java volatile关键字作用及使用场景的相关知识点内容,需要的朋友们学习下。

    一文精通Java中的volatile关键字

    volatile是java中的关键词之一,这篇文章主要给大家介绍了关于Java中volatile关键字的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    简单了解java volatile关键字实现的原理

    主要介绍了简单了解volatile关键字实现的原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java中Volatile的作用实例解析

    本篇文章给大家通过实例分享了Java中Volatile的作用,有兴趣的朋友可以学习参考下。

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

    主要介绍了Java并发volatile可见性的验证实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java的Volatile实例用法及讲解

    在本篇文章里小编给大家整理了关于Java的Volatile知识点相关内容,有需要的朋友们可以跟着学习下。

    简单了解java volatile

    主要介绍了了解java volatile,volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。下面我们来一起学习一下吧

    Java volatile的适用场景实例详解

    在本文里我们给大家整理了一篇关于Java volatile的适用场景实例内容和知识点,需要的朋友们可以学习下。

    Java Volatile关键字实现原理过程解析

    主要介绍了Java Volatile关键字实现原理过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java Volatile关键字同步机制详解

    主要介绍了Java Volatile关键字同步机制详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java中的关键字volatile详解

    主要介绍了Java中的关键字volatile,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java实习生面试复习(八):volatile的学习

    volatile也是多线程这块经常问到的基础问题,以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(JMM),Java并发编程的一些特性都牵扯出来,我们这篇文章就来学习一下volitile关键字吧!...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《java jdk 7学习笔记》是作者多年来教学实践经验的总结,汇集了教学过程中学生在学习java时遇到的概念、操作、应用或认证考试等问题及解决方案。  《java jdk 7学习笔记》针对java se 7新功能全面改版,无论是...

    Java中volatile关键字实现原理

    本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,对Java中volatile关键字实现原理感兴趣的朋友一起通过本文学习吧

    学习Java多线程之volatile域

    主要为大家详细介绍了Java多线程之volatile域,Java 语言提供了一种稍弱的同步机制,即volatile,本文为大家解答,感兴趣的小伙伴们可以参考一下

    volatile学习手册

    volatile是Java提供的轻量级的同步机制,保证了可见性,不保证原子性。

    java线程学习笔记

    2.3 线程本地存储(Java.lang.ThreadLocal) 15 2.4 线程阻塞 17 2.4.1 调用sleep(millisecond)使任务进入休眠状态 17 2.4.2 等待输出与输入 17 2.4.3 对象锁不可用 17 2.4.4 通过wait()使线程挂起。 17 2.5 线程...

    java多线程volatile内存语义解析

    主要介绍了java多线程volatile内存语义解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics