`

java的volatile是什么意思

阅读更多
我们知道,在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步。

这在JVM 1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。

在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。

要解决这个问题,只需要像在本程序中的这样,把该变量声明为volatile(不稳定的)即可,这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。一般说来,多任务环境下各任务间共享的标志都应该加volatile修饰。

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

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

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

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

使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。

由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。

注:我在单例模式中用到此关键字.
分享到:
评论
17 楼 qingfeng825 2013-09-04  
kunsyliu 写道
漂亮姐姐,

如果两个线程同时要求修改呢????好像也会不一致啊!!!!

一个线程请求修改,读取了共享内存,但在完成写入前,

另一线程要求修改。会是什么情况????


volatile只能用在一个线程改,多个线程读的情况下,两个线程同时修改是不行的。
16 楼 snow8261 2013-01-07  
写的不错
15 楼 qiuyu1990 2012-10-13  
很好理解
14 楼 kunsyliu 2012-09-03  
漂亮姐姐,

如果两个线程同时要求修改呢????好像也会不一致啊!!!!

一个线程请求修改,读取了共享内存,但在完成写入前,

另一线程要求修改。会是什么情况????

13 楼 zhanghh321 2011-07-26  
12 楼 leiquanrui 2011-03-20  
分析得很好啊,容易理解
11 楼 star022 2010-11-03  
灰常强悍的女程序员~~
10 楼 xueyi_lee 2010-10-20  
哇,楼主厉害呀,我佩服你,呵呵 
9 楼 andyjackson 2010-10-03  
8 楼 jaisok 2010-10-03  
好好好好好好
7 楼 lwwin 2010-09-18  
特地搜索了C# VOLATILE和 JAVA VOLATILE,没想到都有- -
女程很辛苦^-^
6 楼 jeff2008 2010-08-04  
5 楼 wjjxf 2010-07-22  
4 楼 dracularking 2010-05-26  
能问个问题吗 为什么要在单例中用volatile呢 除了eagerly created instance(饿汉式)外,uniqueInstance几乎都是被包围在synchronized关键字之下的
3 楼 spacefly 2009-07-21  
哇,真正的女程序员哦,第一次见,
不过写的真的不错,赞一个,学习了
2 楼 yangzhihuan 2009-04-15  
知道了java中有volatile关键字,多谢.
1 楼 flyinglife 2008-08-03  
博主,原创的么?相当不错!

相关推荐

    java volatile 关键字实战

    java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java ...

    Java线程:volatile关键字

    Java 线程 volatile 关键字详解 Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。volatile 变量的同步性较差,但它有时更简单并且开销更低。volatile 变量可以被看作是一种 “程度较轻的 ...

    Java里volatile关键字是什么意思

    Java中的`volatile`关键字是用来解决多线程环境下的可见性和有序性问题的。它确保了被`volatile`修饰的变量在任何线程中都具有最新的值,但并不保证线程安全,即不保证并发操作的原子性。 首先,我们要理解Java内存...

    java volatile 关键字 学习

    java volatile 关键字 学习

    【Java面试题】volatile的作用

    【Java面试题】volatile的作用

    Java volatile与AQS锁内存可见性

    从JUC中的AQS引入,讲解Java volatile与AQS锁内存可见性

    violate java-Java 之 volatile 超级详解

    Java中的`volatile`关键字是多线程编程中一个非常重要的概念,它用于修饰变量,确保在并发环境下,多个线程可以正确地共享和同步数据。本文将深入探讨`volatile`关键字的工作原理、特性以及如何使用它来解决多线程中...

    Java并发编程:volatile关键字解析

    ### Java并发编程:volatile关键字解析 #### 一、内存模型的相关概念 在深入了解`volatile`关键字之前,我们首先需要理解计算机内存模型的一些基本概念。在现代计算机系统中,CPU为了提高执行效率,会将频繁访问的...

    java语言的volatile教程,java语言的volatile关键字是干什么用的

    java语言的volatile教程,java语言的volatile关键字到底怎么用

    Java volatile关键字详解.docx

    volatile

    18Java内存模型:Java中的volatile有什么用?1

    在Java中,`volatile`关键字是用于解决并发问题的一个关键工具。它主要提供以下两个功能: 1. **可见性**:当一个线程修改了一个`volatile`变量时,这个修改会立即对其他所有线程可见。这意味着一旦一个线程修改了`...

    Java Volatile 变量详解及使用方法

    Java中的`volatile`关键字是用来修饰变量的,它主要用于解决多线程环境下的数据同步问题。在Java语言中,`volatile`变量提供了一种轻量级的同步机制,它确保了共享变量的可见性和有序性,但并不保证原子性。 **可见...

    java里的volatile关键字详解

    "Java中的Volatile关键字详解" Java中的Volatile关键字详解是Java中的一种关键字,用于保证线程之间的可见性、原子性和有序性。下面是对Java中的Volatile关键字详解的知识点总结: 一、基本概念 1. 可见性:可见...

    一文精通Java中的volatile关键字

    Java中的`volatile`关键字是多线程编程中的一个重要概念,它的主要作用是确保共享变量的可见性和禁止指令重排序。本文将深入探讨`volatile`的关键特性、工作原理以及使用注意事项。 1. 可见性: `volatile`关键字...

    java面试题02-volatile是什么

    c#、java、php等多语言解决方案源代码 Wafer - 快速构建具备弹性能力的微信小程序 https://github.com/tencentyun/wafer 重要: 1.第二步,可以在5分钟内实现; 2.成本3元(腾讯云支持微信小程序2017年推广期间,3...

    java volatile关键字使用方法及注意事项

    volatile关键字在Java编程语言中扮演着重要的角色,特别是在多线程环境下的同步和可见性问题。它是Java内存模型(JMM)的一部分,用于确保共享变量的可见性和有序性,但不保证原子性。 1. **volatile的可见性**:当...

    java volatile关键字作用及使用场景详解

    Java中的`volatile`关键字是一个非常重要的并发编程工具,它的主要作用是确保共享变量在多线程环境下的可见性和有序性。下面将详细解释`volatile`的关键特性、它如何解决并发问题以及相关的`happens-before`原则。 ...

Global site tag (gtag.js) - Google Analytics