`
tjsy4050
  • 浏览: 21773 次
  • 来自: ...
社区版块
存档分类
最新评论

java volatile关键字的用途

阅读更多

volatile关键字有什么用?


  恐怕比较一下volatile和synchronized的不同是最容易解释清楚的。volatile是变量修饰符,而synchronized则作用于一段代码或方法;看如下三句get代码:
int i1;                          int geti1() {return i1;}
volatile int i2;              int geti2() {return i2;}
int i3; synchronized     int geti3() {return i3;}

  geti1()得到存储在当前线程中i1的数值。多个线程有多个i1变量拷贝,而且这些i1之间可以互不相同。换句话说,另一个线程可能已经改变了它线程内的i1值,而这个值可以和当前线程中的i1值不相同。事实上,Java有个思想叫“主”内存区域,这里存放了变量目前的“准确值”。每个线程可以有它自己的变量拷贝,而这个变量拷贝值可以和“主”内存区域里存放的不同。因此实际上存在一种可能:“主”内存区域里的i1值是1,线程1里的i1值是2,线程2里的i1值是3——这在线程1和线程2都改变了它们各自的i1值,而且这个改变还没来得及传递给“主”内存区域或其他线程时就会发生。
  而geti2()得到的是“主”内存区域的i2数值。用volatile修饰后的变量不允许有不同于“主”内存区域的变量拷贝。换句话说,一个变量经volatile修饰后在所有线程中必须是同步的;任何线程中改变了它的值,所有其他线程立即获取到了相同的值。理所当然的,volatile修饰的变量存取时比一般变量消耗的资源要多一点,因为线程有它自己的变量拷贝更为高效。
  既然volatile关键字已经实现了线程间数据同步,又要synchronized干什么呢?呵呵,它们之间有两点不同。首先,synchronized获得并释放监视器——如果两个线程使用了同一个对象锁,监视器能强制保证代码块同时只被一个线程所执行——这是众所周知的事实。但是,synchronized也同步内存:事实上,synchronized在“主”内存区域同步整个线程的内存。因此,执行geti3()方法做了如下几步:
1. 线程请求获得监视this对象的对象锁(假设未被锁,否则线程等待直到锁释放)
2. 线程内存的数据被消除,从“主”内存区域中读入(Java虚拟机能优化此步。。。[后面的不知道怎么表达,汗])
3. 代码块被执行
4. 对于变量的任何改变现在可以安全地写到“主”内存区域中(不过geti3()方法不会改变变量值)
5. 线程释放监视this对象的对象锁
  因此volatile只是在线程内存和“主”内存间同步某个变量的值,而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源。

 

分享到:
评论

相关推荐

    java关键字总结文档

    ### Java关键字总结 Java是一种广泛使用的面向对象编程语言,它具备简单性、可移植性、高性能等特点。在Java中,关键字具有特殊的语法含义,不能用作标识符(例如变量名或方法名)。以下是对给定文件中提到的Java...

    JAVA标识符关键字和数据类型.ppt

    Java中一些赋以特定的含义,用做专门用途的字符串称为关键字(keyword)。所有Java关键字都是小写英文字符串。goto和const虽然从未使用,但也作被为Java关键字保留。Java关键字包括: * 原始数据类型:byte、short...

    java关键字、保留字

    本文将详细介绍Java中的关键字及其用途。 #### 关键字列表与解释 1. **abstract** - **用途**:用于声明抽象类和抽象方法。抽象类不能实例化,只能作为其他类的父类。抽象方法是没有实现的方法,必须在子类中提供...

    Java关键字详细解

    这篇文档《Java关键字详细解》将深入探讨Java中的关键字及其用途。 首先,我们来看看Java中的主要关键字。`public`、`private`、`protected`是访问修饰符,用于控制类、方法和变量的访问权限。`public`可以被任何...

    java关键字

    ### Java关键字详解 ...每个关键字都有其特定的用途和规则。通过深入理解这些关键字的功能,开发者能够更高效地编写清晰、简洁且易于维护的代码。希望本文的介绍能帮助读者更好地理解和运用Java的关键字。

    java中的关键字大全

    在Java编程语言中,关键字是一组预定义的词汇,它们具有特殊的含义和用途。理解和掌握这些关键字对于编写有效的Java程序至关重要。本文将详细介绍Java中的一些核心关键字,并提供相应的解释和示例。 #### 关键字...

    Java关键字

    下面将详细介绍这些关键字及其用途。 1. **abstract** - 用于声明抽象类或抽象方法,不能实例化抽象类,只能作为其他类的父类。 2. **assert** - 用于单元测试,断言某个条件是否为真。 3. **boolean** - 数据...

    JAVA所有关键字的含义

    下面,我们将详细探讨Java中的所有关键字及其用途。 1. `abstract`:抽象的,用于声明类或方法不提供具体实现。 2. `assert`:断言,用于测试假设条件,用于调试。 3. `boolean`:布尔类型,表示逻辑值 true 或 ...

    JAVA关键字

    Java关键字是编程的基础,它们是Java语言预定义的、具有特殊含义的标识符,不能作为变量名、方法名或类名。以下是对50个Java关键字的详细解释: 1. **abstract**:用于声明抽象类或抽象方法,不包含具体实现。 2. ...

    java关键字和java命名规范.pdf

    Java关键字是Java语言内置的、具有特殊用途的保留字,而命名规范则是关于如何给类、方法、变量等命名的约定。 ### Java关键字 Java关键字(也称为保留字)是指在Java语言中具有特殊含义的词,它们不能用作变量名、...

    Java的关键字.pdf

    下面将详细解释Java中的部分关键字及其用途。 1. `public`:这是一个访问修饰符,用于声明类、方法或变量可以被任何其他代码访问,无论它们位于哪个包中。 2. `double`:这是Java的内置数据类型之一,用于存储双...

    Java标识符、关键字和保留字

    Java中的关键字、保留字和标识符是程序设计的基本组成元素,它们具有特定的含义和用途。 **关键字**: 在Java中,关键字具有特殊的意义,它们是编程语言的保留字,用来指示编译器执行特定的操作。Java关键字是小写...

    中华石杉的架构笔记,Java工程师面试突击 - 已解锁可做笔记.pdf

    总之,中华石杉的这篇架构笔记是面向Java工程师面试准备的一份宝贵资料,它不仅简洁明了地介绍了volatile关键字的用途和原理,而且还在末尾提醒读者,对于volatile的更深层次理解将在后续的文章中继续探讨。...

    Java关键字解析.pdf

    `static`关键字有多种用途,它可以修饰成员变量、方法和代码块。静态成员属于类,而非类的实例,因此可以不创建对象直接访问。静态代码块在类加载时执行,常用于初始化静态变量。此外,`static`还可以用于导入整个包...

    java关键字。必须记的

    ### Java关键字详解 #### Abstract `abstract` 是Java中的一个关键字,用于定义抽象类或抽象方法。抽象类是不能被实例化的类,主要用于提供子类一个基础模板,并强制子类去实现某些特定的方法。抽象方法是没有实现...

    search_keyword12.rar_Java关键字

    - 其他关键字:如void、static、final、abstract、native、transient、volatile等,各有特定用途。 2. Java关键字应用示例: - `public class HelloWorld {` 这行代码定义了一个公共类HelloWorld,可供其他类访问...

    【IT十八掌徐培成】Java基础第02天-01.java关键字.zip

    本教程"【IT十八掌徐培成】Java基础第02天-01.java关键字"深入讲解了Java的关键字及其用途。 Java的关键字主要分为以下几类: 1. 数据类型关键字:`byte`, `short`, `int`, `long`, `float`, `double`, `char`, `...

    java关键字.pdf

    Java关键字是Java语言中预先定义的、具有特殊意义的单词,它们在Java程序中有着特殊的用途,比如用来声明数据类型、定义流程控制语句等。根据提供的部分内容,可以将Java的关键字分类并阐述它们的作用。 1. 访问...

    最完整的java关键字解释.doc

    - **定义**:`const`是一个保留关键字,目前在Java中没有具体用途。 - **用途**:无实际用途。 #### 10. Continue - **定义**:`continue`关键字用于跳过当前循环迭代中的剩余部分,并立即开始下一次迭代。 - **...

    java编程全部关键字解释

    Java编程语言的关键字是语言的核心组成部分,它们具有...`void`, `volatile`, `while` 等等,它们各自都有独特的功能和用途,在编写Java代码时扮演着不可或缺的角色。学习和理解这些关键字是掌握Java编程基础的关键。

Global site tag (gtag.js) - Google Analytics