`
no7beckham
  • 浏览: 97184 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

volatile关键字有什么用?

    博客分类:
  • JAVA
 
阅读更多
恐怕比较一下volatile和synchronized的不同是最容易解释清楚的。volatile是变量修饰符,而synchronized则作用于一段代码或方法;看如下三句get代码:

   1. int i1;              int geti1() {return i1;}
   2. volatile int i2;              int geti2() {return i2;}
   3.          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消耗更多资源。
分享到:
评论

相关推荐

    4.4 volatile关键字有什么作用?.rar

    本篇文章将深入探讨volatile关键字的作用,并结合GD32F303单片机的使用场景,来阐述它在实际开发中的应用。 首先,volatile关键字是C/C++语言中的一个修饰符,它的主要功能是告诉编译器,该变量的值可能会在编译器...

    java volatile 关键字实战

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

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

    #### 五、使用volatile关键字的场景 1. **状态标志**:`volatile`关键字非常适合用于表示某个状态标志,如线程是否应该停止运行。由于`volatile`关键字保证了线程间的可见性,因此当一个线程改变了这个状态标志,...

    详解C中volatile关键字

    volatile关键字的含义是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并、常量传播等优化,进一步可以死代码消除。但有时这些优化不是...

    深入解析Java中的volatile关键字:原理、应用与实践

    本文将详细探讨volatile关键字的工作原理、使用场景以及如何在实际开发中正确使用volatile。 volatile关键字是Java并发编程中一个重要的工具,它通过确保变量的可见性和禁止指令重排序来提高程序的并发性能。然而,...

    java里的volatile关键字详解

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

    深入理解 volatile 关键字.doc

    深入理解volatile关键字 volatile关键字是Java语言的高级特性,它可以保证可见性和禁止指令重排序,但是要弄清楚...在使用volatile关键字时,需要遵守相关的规则,并且需要弄清楚Java内存模型,以免出现不必要的错误。

    volatile关键字使用

    此外,`volatile`关键字的使用需要谨慎,过度使用可能会导致性能下降,因为它阻止了编译器的优化。只有在确实需要处理可能由非程序控制因素更改的变量时,才应该使用`volatile`。在大多数情况下,使用线程安全的数据...

    深入多线程之:内存栅栏与volatile关键字的使用分析

    以前我们说过在一些简单的例子中,比如为一个字段赋值或递增该字段,我们需要对线程进行同步,虽然lock可以满足我们的需要,但是一个竞争锁一定会导致阻塞,然后忍受线程上下文切换和调度的开销,在一些高并发和性能...

    C++中volatile关键字及常见的误解总结

    C++中volatile关键字及常见的误解总结 C++中的volatile关键字是一种类型修饰符,用来修饰变量,表示该变量可以被某些编译器未知的因素更改,比如操作系统、硬件或者其它线程等。 volatile关键字的主要作用是提供对...

    java volatile 关键字 学习

    java volatile 关键字 学习

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

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

    Java中volatile关键字实现原理

    使用反汇编查看汇编层面对字节码,可以看到volatile关键字做了什么。在JVM中,volatile关键字会在汇编层面上生成一个Lock前缀的指令,这个指令将会锁定缓存行,从而保证变量在多线程之间的可见性。 四、volatile...

    AVR-GCC 中如何使用volatile 关键字.pdf

    - 对于那些不确定是否需要使用 `volatile` 的变量,可以通过分析变量的使用场景来决定是否有必要使用。 总之,`volatile` 关键字在AVR-GCC环境中有着重要的作用,尤其是在需要处理多任务、中断等复杂场景时。正确...

    Java线程:volatile关键字

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

    volatile关键字 Const关键字 static关键字 mutable 关键字

    在C/C++编程语言中,`volatile`, `const`, `static` 和 `mutable` 是四个非常重要的关键字,它们各自有着独特的用途和含义。下面将详细解释这些关键字的作用以及它们在程序设计中的应用。 1. `volatile` 关键字 `...

    Java并发volatile关键字.docx

    Java并发编程中,volatile关键字扮演着重要的角色,它是一种轻量级的同步机制,与synchronized相比,volatile在性能上更优,因为它不会导致线程阻塞。在深入理解volatile的关键特性之前,我们需要先了解Java内存模型...

    一文精通Java中的volatile关键字

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

    面试官最爱的volatile关键字.docx

    在Java编程中,volatile关键字是一个至关重要的概念,尤其在多线程环境下,理解并正确使用volatile是面试时必不可少的知识点。volatile被视为synchronized的一种轻量级实现,但两者在特性上存在显著差异。 首先,...

    Java多线程 volatile关键字详解

    Java多线程volatile关键字详解 Java多线程volatile关键字...在多线程环境下,使用volatile关键字可以避免线程之间的数据不一致问题,但是需要注意volatile关键字的局限性,避免在不适合的场景下使用volatile关键字。

Global site tag (gtag.js) - Google Analytics