volatile

0人阅读 评论(0) 收藏 举报
分类:

一.定义:

    volatile是相较于synchronized的轻量级所,可保持数据的可见性,但是不能保证操作的原子性.


    volatile所修饰的变量是直接存在于主内存中的,线程对变量的操作也是直接反映在主内存中,所以说其是易变的。


  JMM中的内存分为主内存和工作内存,其中主内存是所有线程共享的,而工作内存是每个线程独立分配的,各个线程的工作内存之间相互独立、互不可见。在线程启动的时候,虚拟机为每个内存分配了一块工作内存,不仅包含了线程内部定义的局部变量,也包含了线程所需要的共享变量的副本,当然这是为了提高执行效率,读副本的比直接读主内存更快。

  volatile修饰的变量(共享变量)来说,在工作内存发生了变化后,必须要马上写到主内存中,而线程读取到是volatile修饰的变量时,必须去主内存中去获取最新的值,而不是读工作内存中主内存的副本,这就有效的保证了线程之间变量的可见性。

二.volatile特性:

       1)内存可见性,线程直接读取主内存中的数据,修改数据后直接保存数据到主内存中.

       2)可以禁止指令重排序.   

           指令重排序:为了尽可能减少内存操作速度远慢于CPU运行速度所带来的CPU空置的影响,虚拟机会

        按照自己的一些规则将程序编写顺序打乱。




查看评论

volatile的适用场景(面试问题:volatile有什么作用)

把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility)。 原子性意味着个时刻,只有一个线程能够执行一段代码,这段...
  • hxpjava1
  • hxpjava1
  • 2017-02-15 09:37:31
  • 1433

volatile的使用及其原理

1、 volatile的作用相比Sychronized(重量级锁,对系统性能影响较大),volatile提供了另一种解决可见性和有序性问题的方案。对于原子性,需要强调一点,也是大家容易误解的一点:对v...
  • devotion987
  • devotion987
  • 2017-03-30 14:52:54
  • 328

Java中的static和volatile变量的区别?

在java中声明一个静态变量,意味着只有一个副本,无论创建了多少个类的对象,即使没有创建对象,变量也可以访问,但是线程可能具有本地缓存的值。 当变量volatile而不是静态时,每个object都有一...
  • wyy6713
  • wyy6713
  • 2017-03-30 15:44:35
  • 1568

Atomic与Volatile对比

java.util.concurrent.atomic.Atomic*原子类和volatile关键字是java中两种常见的处理多线程下数据共享读写的机制。二者看似相同,但是在实际应用中有着不小的差别。...
  • zmx729618
  • zmx729618
  • 2016-10-10 13:54:29
  • 3457

volatile的使用条件

volatile的使用条件 Volatile 变量具有 synchronized 的可见性特性,但是不具备原子性。这就是说线程能够自动发现 volatile 变量的最新值。 Volatil...
  • luman1991
  • luman1991
  • 2016-10-19 17:32:46
  • 304

【记录】Volatile的意义

((volatile unsigned long )) 这个语句对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语...
  • jiasike
  • jiasike
  • 2016-07-18 09:23:23
  • 727

volatile常量在同步的使用详解

volatile常量在同步的使用详解把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility)。 原子性意味着个时...
  • qq_15807167
  • qq_15807167
  • 2016-07-19 15:46:41
  • 2306

volatile深入分析( 什么时候使用volatile)

原文:http://blog.csdn.net/vernonzheng/article/details/8201744 volatile 变量提供了线程的可见性,并不能保证线程安全性和原...
  • jinfeiteng2008
  • jinfeiteng2008
  • 2016-12-01 17:16:28
  • 2824

Java Volatile(包含对volatile数组和对象的理解)

1.多线程中重要概念
  • u014108122
  • u014108122
  • 2014-07-27 16:26:17
  • 6269

(*(volatile unsigned int *))详解

最开始看到volatile的时候相当费解,后来到网上去查看了下,大致明了。 使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义#define RAM_ADDR (*(volatile...
  • deng529828
  • deng529828
  • 2011-02-23 15:41:00
  • 3508
    个人资料
    等级:
    访问量: 297
    积分: 44
    排名: 182万+
    文章分类
    文章存档