现代计算机都是冯诺依曼结构的

volatile 变量具备两种特性,其一是保证该变量对所有线程可见,这里的可见性指的是当一个线程修改了变量的值,那么新的值对于其他线程是可以立即获取的。其二 volatile 禁止了指令重排。

多线程的运行可能造成变量数据的不一致

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

Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。

synchronized开销比volatile大。

volatile不保证原子操作,所以,很容易读到脏数据。

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

附录:

Happens-Before法则:

  1. 程序次序法则:线程中的每个动作A都Happens-Before于该线程中的每一个动作B,在程序中,所有的动作B都出现在动作A之后。

  2. Lock法则:对于一个Lock的解锁操作总是Happens-Before于每一个后续对该Lock的加锁操作。

  3. volatile变量法则:对于volatile变量的写入操作Happens-Before于后续对同一个变量的读操作。

  4. 线程启动法则:在一个线程里,对Thread.start()函数的调用会Happens-Before于每一个启动线程中的动作。

  5. 线程终结法则:线程中的任何动作都Happens-Before于其他线程检测到这个线程已经终结或者从Thread.join()函数调用中成功返回或者Thread.isAlive()函数返回false。

  6. 中断法则:一个线程调用另一个线程的interrupt总是Happens-Before于被中断的线程发现中断。

  7. 终结法则:一个对象的构造函数的结束总是Happens-Before于这个对象的finalizer(Java没有直接的类似C的析构函数)的开始。

  8. 传递性法则:如果A事件Happens-Before于B事件,并且B事件Happens-Before于C事件,那么A事件Happens-Before于C事件。

转载于:https://www.cnblogs.com/1234cjq/p/8286642.html

多线程之volatile关键字相关推荐

  1. Java多线程之volatile详解

    Java多线程之volatile详解 目录: 什么是volatile? JMM内存模型之可见性 volatile三大特性之一:保证可见性 volatile三大特性之二:不保证原子性 volatile三 ...

  2. JAVA多线程之volatile 与 synchronized 的比较

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:hapjin cnblogs.com/hapjin/p/54 ...

  3. Java并发编程之volatile关键字

    大概是因为项目.业务的原因,工作上几乎还没有使用过多线程相关的功能,相关知识差不多都忘了,所以最近补一下基础. volatile用来修饰共享变量,volatile变量具有 synchronized 的 ...

  4. java多线程之volatile理解

       最近一直在看多线程的一些知识,看了一些书和一些博客,收获还是挺多的,最近看了<java并发编程的艺术>这本书感觉收获很大也推荐给各位,同时也结合以前看的博客就好好的总结一下自己所学的 ...

  5. java volatile 多线程_Java多线程之volatile

    在学习Volatile之前有必要简单了解一下物理内存模型和Java的内存模型,这样对理解Volatile大有好处. 寄存器 首先我们要知道的是所有运算操作都是在CPU的寄存器中进行的,而CUP的执行涉 ...

  6. JAVA多线程之Synchronize 关键字原理

    image 众所周知 Synchronize 关键字是解决并发问题常用解决方案,有以下三种使用方式: 同步普通方法,锁的是当前对象. 同步静态方法,锁的是当前 Class 对象. 同步块,锁的是 {} ...

  7. volatile 关键字总结,原理+示例 - Java 轻量级同步

    本文概述 volatile 关键字对增删改查程序员应该是比较陌生的.(反正我前几年是一次没用过) 暴露了我菜鸡的水准... volatile 是 JVM 提供的一种轻量级的同步机制. Java 语言包 ...

  8. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  9. 并发编程之 Java 内存模型 + volatile 关键字 + Happen-Before 规则

    前言 楼主这个标题其实有一种作死的味道,为什么呢,这三个东西其实可以分开为三篇文章来写,但是,楼主认为这三个东西又都是高度相关的,应当在一个知识点中.在一次学习中去理解这些东西.才能更好的理解 Jav ...

  10. Java多线程之Synchronized和Lock的区别

    Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...

最新文章

  1. aserisk笔记(dahdi工具相关)
  2. 《工具癖》Mac与Windows获取文件绝对路径的快捷键
  3. 深入理解表单脚本系列第一篇——表单对象
  4. 苹果CMS v10一键采集芒果tv官方直链地址插件
  5. 批处理管理文件以及文件夹
  6. 会议通知|2019暑期全国高校Python数据分析与实训课程高级研修班
  7. Kafka-partition
  8. reactNative之react-native-picker
  9. 【OpenCV学习笔记】【函数学习】一(MFC+OpenCV2.4.7读取摄像头之cvCaptureFromCAM()的索引问题
  10. CSDN账号登录异常,一个网址帮你找回账号
  11. Centos操作系统
  12. JS封装数组API push,pop,shift,unshift,sort, reverse
  13. 前端框架是什么意思?
  14. 1200000有多少个约数(只计算正约数)。
  15. iOS 一步一步带你实现引导页
  16. 苹果ppt_惊艳!苹果发布会最爱用的PPT动画,居然这么简单
  17. 【点云系列】基于图结构的点云快速重采样 翻译
  18. 【HDU 1869】六度分离
  19. 不用发论文也不教课的12名教授,为这个研究所拿下8次学界最高奖
  20. 风险提醒之Oracle RAC高可用失效

热门文章

  1. pycharm右侧显示代码缩略图/预览 CodeGlance
  2. 称重仪表显示ol怎么解决_电脑显示器无信号怎么解决呢?
  3. Android中的数据编码,Android与服务端数据传输的编码处理
  4. cxf超时设置不起效_jmeter集合点设置(十三)
  5. wpf分页预览html文件,用WPF实现打印及打印预览
  6. java中volatile关键字_Java中Volatile关键字详解
  7. JAVA实验面向对象程序设计,面向对象程序设计a(java)实验报告.docx
  8. javascript函数防抖Debounce
  9. 零元学Expression Blend 4 - Chapter 28 ListBox的基本运用与更改预设样式
  10. python条件、循环、终止