Java并发编程:volatile关键字解析及内存模型

1、线程内存模型:
  缓存一致性协议(如MESI),每个线程有单独的内存存放共享变量的副本。
  它核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。

2、并发中的三个概念
  2.1原子性:要么不执行,要么执行不被打断;
  2.2可见性:一个线程修改共享变量的值,其他线程能立即看到;
  2.3有序性:jvm会对代码进行指令重排序;虽然不会影响单一线程的结果,但会影响多线程条件下的正确性;
3、java内存模型:
    jvm规范视图制定一种java内存模型(jmm)屏蔽各个硬件平台和操作系统的内存访问差异。在jmm中也会存在缓存一致性和指令重排序问题;
  3.1原子性:jmm只保证基本读取和基本赋值(x=y不是)是原子性操作;
  3.2可见性:volatile关键字:当某个线程修改共享变量的值时,会立即将其更新到主存,并使其他线程内的值无效,通知其从新从主存读取;
       synchronized和Lock也能保证可见性:同一时刻只有一个线程获取锁,更新值,在所释放前,更新到主存。
  3.3有序性:volatile只能保证一定的有序性,
        synchronized和Lock能完全保证。
        jmm具备部分先天有序性:happen-before原则;
4、volatile对三种概念的支持:
  4.1可见性:完全支持,修改后写入主存,通知其他对应变量线程缓存无效,从主存读;
  4.2原子性:无法保证,如对volatile int n;thread1读取变量n,并检查缓存有效,然后被阻塞;thread2读取n后修改,写会主存阻塞;thread1继续running,还是修改前的值。
  4.3有序性:一定程度,volatile禁止指令重排序:如volatile i++;它保证volatile之前所有对i的操作都已经被执行,且i++发生在所有后续代码执行之前。
5、volatile的底层原理:
  实际上在class文件中,标有volatile的变量在进行写操作时,会在前面加上lock质量前缀:
  5.1将当前处理器缓存行的数据写回到内存。lock指令前缀在执行指令的期间,会产生一个lock信号,lock信号会保证在该信号期间会独占任何共享内存。lock信号一般不锁总线,而是锁缓存。因为锁总线的开销会很大。
  5.2将缓存行的数据写回到内存的操作会使得其他CPU缓存了该地址的数据无效。
6、应用场景:
  6.1状态标记量 volatile boolean flag = false;
  6.2双重检查double check

java的内存模型Jmm如下:

Java并发机制(3)--volatile关键字与内存模型的更多相关文章

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

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

  2. (转)Java并发编程:volatile关键字解析

    转:http://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或 ...

  3. Java并发编程:volatile关键字解析(转载)

    转自https://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析   Java并发编程:volatile关键字解析 ...

  4. Java并发编程:volatile关键字解析-转

    Java并发编程:volatile关键字解析 转自海子:https://www.cnblogs.com/dayanjing/p/9954562.html volatile这个关键字可能很多朋友都听说过 ...

  5. 6、Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

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

    Java并发编程:volatile关键字解析 Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字, ...

  7. [转载]Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

  8. Java并发编程:volatile关键字解析(学习总结-海子)

    博文地址:Java并发编程:volatile关键字解析

  9. 【Java并发编程】6、volatile关键字解析&内存模型&并发编程中三概念

    volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...

随机推荐

  1. python写的百度图片爬虫

    学了一下python正则表达式,写一个百度图片爬虫玩玩. 当技术遇上心术不正的人,就成我这样的2B青年了. python3.6开发.程序已经打包好,下载地址: http://pan.baidu.com ...

  2. navicat:[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and ...

    mysql5.7,xshell下执行sql不会报下面的错,但是navicat会报错,可能是navicat版本问题,换其他客户端不会出现问题. [Err] 1055 - Expression #1 of ...

  3. 【基础知识】CPU 是如何工作的 |CPU 通过总线读取内存的工作方式

    一.简单cpu  是如何工作 方式讲解 CPU 的根本任务就是执行指令,对计算机来说最终都是一串由 0 和 1 组成的序列.CPU 从逻辑上可以划分成 3 个模块,分别是控制单元.运算单元和存储单元 ...

  4. Oracle数据库巡检

    转至:https://blog.51cto.com/sf1314/2123068 select inst_id,status,count(*) from gv$session group by ins ...

  5. OJ教程--DevC++快捷键

    一些常用的快捷键如下: 1.F9编译 2.F10运行 3.F11编译+运行 4.Ctrl + Home键 跳转到当前文本的开头处. 5.Ctrl + End键 跳转到当前文本的末尾处. 6.Ctrl ...

  6. Leaflet:Marker、Popup类

    Marker.Popup.Tooltip类都是继承自Layer类:Event与Layer Marker 1.用例 L.marker([41,123]).addTo(map); 2.实例化 L.mark ...

  7. 阿里云 elk 搭建

    1.logstash通过redis收集日志. logstash > redis>logstash  >es k8s日志挂载 tong sudo umount -t glusterfs ...

  8. C# 反编译工具之dnSpy

    下载地址:https://github.com/0xd4d/dnSpy/releases无需安装,和 ILSPY同门,感觉比ILSPY还强大 直接把dll拖拽到程序集资源管理器里面就可以啦

  9. pandas模块篇(之二)

    今日内容概要 布尔选择器 索引 数据对齐 数据操作(增出改查) 算术方法 DataFrame(Excel表格数据) 布尔选择器 import numpy as np import pandas as ...

  10. Spring框架第一天(搭建项目)

    Spring框架 1.简介 1.1 Spring是什么 一个开源的框架,是JavaEE开源框架 Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以IoC(Inve ...