场景引入 可见性问题

先来看一张图:

上面的图,是简化版的Java内存模型,一个线程有自己的工作内存,同时还有一个共享的主内存。

线程1和线程2读取数据data时,先从主内存里加载data变量的值到工作内存,然后才可以使用那个值。

假设现在线程1修改了data变量的值为1,然后将这个修改写入到自己的工作内存。那么此时,线程1的工作内存里data的值为1,而主内存里data的值还是0。线程2的工作内存data值也是0。

这就尴尬了,线程1和线程2操作的是用一个变量data,但由于线程本地缓存的存在,导致线程1对data变量的修改,线程2不能及时看到。

这就是Java并发编程中的可见性问题当一个线程修改某个共享变量的值,其他线程是否能够立即知道这个修改。

值得注意的是,上面的Java内存模型是极其简化的,真实的情况远比上面复杂。

volatile的作用及实现原理

要解决上述可见性问题,我们可以使用volatile关键字。

在加入volatile关键字后,线程1只要修改data变量的值,就会在修改工作内存data变量值的同时,强制将修改刷新到主内存中。与此同时,线程2需要读取data变量时,先强制将主内存的值刷新到工作内存中,从而保证线程2每次读取都是最新的值。如下图:

volatile工作原理如上所述,其在JVM底层的实现原理,涉及到内存屏障相关概念。简单来说,JVM在在遇到volatile变量时,在其写操作之后插入一个store屏障,在其读操作之前插入一个load屏障。

Java volatile关键字实现原理的更多相关文章

  1. Java volatile 关键字底层实现原理解析

    本文转载自Java volatile 关键字底层实现原理解析 导语 在Java多线程并发编程中,volatile关键词扮演着重要角色,它是轻量级的synchronized,在多处理器开发中保证了共享变 ...

  2. [Java并发编程(五)] Java volatile 的实现原理

    [Java并发编程(五)] Java volatile 的实现原理 简介 在多线程并发编程中 synchronized 和 volatile 都扮演着重要的角色,volatile 是轻量级的 sync ...

  3. [Java并发编程(三)] Java volatile 关键字介绍

    [Java并发编程(三)] Java volatile 关键字介绍 摘要 Java volatile 关键字是用来标记 Java 变量,并表示变量 "存储于主内存中" .更准确的说 ...

  4. 13、Java并发性和多线程-Java Volatile关键字

    以下内容转自http://tutorials.jenkov.com/java-concurrency/volatile.html(使用谷歌翻译): Java volatile关键字用于将Java变量标 ...

  5. Java Volatile关键字(转)

    出处:  Java Volatile关键字 Java的volatile关键字用于标记一个变量“应当存储在主存”.更确切地说,每次读取volatile变量,都应该从主存读取,而不是从CPU缓存读取.每次 ...

  6. 04 volatile关键字实现原理

    volatile关键字实现原理 1.volatile关键字的语义分析 作用:让其他线程能够马上感知到某个线程多某个变量的修改 保证可见性 对共享变量的修改,其他线程能够马上感知到 保证有序性 在重排序 ...

  7. Java volatile关键字详解

    Java volatile关键字详解 volatile是java中的一个关键字,用于修饰变量.被此关键修饰的变量可以禁止对此变量操作的指令进行重排,还有保持内存的可见性. 简言之它的作用就是: 禁止指 ...

  8. 就是要你懂Java中volatile关键字实现原理

    原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是j ...

  9. 【转】Java学习---Java中volatile关键字实现原理

    [原文]https://www.toutiao.com/i6592879392400081412/ 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.c ...

随机推荐

  1. [计算机视觉][神经网络与深度学习]R-FCN、SSD、YOLO2、faster-rcnn和labelImg实验笔记

    R-FCN.SSD.YOLO2.faster-rcnn和labelImg实验笔记 转自:https://ask.julyedu.com/question/7490 R-FCN paper:https: ...

  2. Apache JMeter 做接口并发测试

    获知来源:查找如何使用Postman进行接口并发测试时,在StackOverflow上看到,说postman只能做串行测试,而且postman并不是被设计做这种测试的:而jmeter就是为了测试而开发 ...

  3. Vue利用搜狐获取公网ip地址

    在index.html中添加代码: <script src="https://pv.sohu.com/cityjson?ie=utf-8"></script> ...

  4. chamfer_pcd

    import tensorflow as tf import numpy as np def distance_matrix(array1, array2): """ a ...

  5. Java开发笔记(一百二十八)Swing的图标

    前面提过,AWT没提供能够直接显示图像的控件,这无疑是个令人诟病的短板,因为一上来就得由程序员自己去定义新控件,对于初学者来讲很不友好.这个问题在Swing中也解决掉了,不过Swing并未提供单独的图 ...

  6. SQL——DELETE(删)

    一.DELETE语句的基本用法 DELETE语句用于删除表中的记录. DELETE语句语法: DELETE FROM 表名 WHERE 条件语句; 演示student表: 删除student表最后一行 ...

  7. flink ETL数据处理

    Flink ETL 实现数据清洗   一:需求(针对算法产生的日志数据进行清洗拆分) 1. 算法产生的日志数据是嵌套json格式,需要拆分 2.针对算法中的国家字段进行大区转换 3.最后把不同类型的日 ...

  8. promethus监控nginx

    一.摘要 promethues监控nginx可选两个exporter,通过nginx_exporter主要是获取nginx-status中的内建的指标,nginx自身提供status信息,较为简单,p ...

  9. Shell变量一览

    Shell变量一览 $# Shell命令的参数个数 $$ Shell本身的进程ID $! Shell最后运行的后台进程的进程ID $? Shell最后运行的命令的退出码(返回值) $- Shell使用 ...

  10. 【ABAP】第一章-基础

    1. ABAP语法基础 1.1 基本数据类型 C.N.D.T.I.F.P.X.string.Xstring P:默认为8字节,最大允许16字节.最大整数位:16*2 = 32 - 1 = 31 -14 ...