内存屏障

由于现代的操作系统都是多处理器.而每一个处理器都有自己的缓存,并且这些缓存并不是实时都与内存发生信息交换.这样就可能出现一个cpu上的缓存数据与另一个cpu上的缓存数据不一致的问题.而这样在多线程开发中,就有可能导致出现一些异常行为.

而操作系统底层为了这些问题,提供了一些内存屏障用以解决这样的问题.目前有4种屏障.

LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。

StoreStore屏障:对于这样的语句Store1; StoreStore; Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。

LoadStore屏障:对于这样的语句Load1; LoadStore; Store2,在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。

StoreLoad屏障:对于这样的语句Store1; StoreLoad; Load2,在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。它的开销是四种屏障中最大的。在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能。

使用

java中对内存屏障的使用在一般的代码中不太容易见到.常见的有两种.

通过 Synchronized关键字包住的代码区域,当线程进入到该区域读取变量信息时,保证读到的是最新的值.这是因为在同步区内对变量的写入操作,在离开同步区时就将当前线程内的数据刷新到内存中,而对数据的读取也不能从缓存读取,只能从内存中读取,保证了数据的读有效性.这就是插入了StoreStore屏障

使用了volatile修饰变量,则对变量的写操作,会插入StoreLoad屏障.

其余的操作,则需要通过Unsafe这个类来执行.

Unsafe中内存屏障的使用

UNSAFE.putOrderedObject类似这样的方法,会插入StoreStore内存屏障

Unsafe.putVolatiObject 则是插入了StoreLoad屏障

java 什么是内存屏障,java内存屏障和可见性相关推荐

  1. java内存栅栏_内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术

    我们经常都听到并发编程,但很多人都被其高大上的感觉迷惑而停留在知道听说这一层面,下面我们就来讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见 ...

  2. java内存屏障_java内存屏障

    java内存屏障 java的内存屏障通常所谓的四种即LoadLoad,StoreStore,LoadStore,StoreLoad实际上也是上述两种的组合,完成一系列的屏障和数据同步功能. LoadL ...

  3. java内存屏障_内存屏障 | 并发编程网 – ifeve.com

    本文我将和大家讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见的一项技术. CPU使用了很多优化技术来实现一个目标:CPU执行单元的速度要远 ...

  4. Java内存模型(Java Memory Model,JMM)

    导读 本文通过对JSR133规范的解读,详细的介绍JMM的核心理论,并将开发中常用的关键字的实现原来做了详细的介绍.通过本文读者可以了解到并发的一些基本理论,并对一些同步原语有了更深层次的理解.希望读 ...

  5. java内存模型 原子性_Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)...

    JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...

  6. 无招胜有招之Java进阶JVM(四)内存模型plus

    一.计算机内存模型: 在多CPU的系统中,每个CPU都有多级缓存,一般分为L1.L2.L3缓存,因为这些缓存的存在,提供了数据的访问性能,也减轻了数据总线上数据传输的压力,同时也带来了很多新的挑战,比 ...

  7. 无招胜有招之Java进阶JVM(三)内存模型

    为什么要有内存模型 在介绍Java内存模型之前,先来看一下到底什么是计算机内存模型,然后再来看Java内存模型在计算机内存模型的基础上做了哪些事情.要说计算机的内存模型,就要说一下一段古老的历史,看一 ...

  8. java final域_【Java】final 域的内存语义

    文章来源:<Java并发编程的艺术> final 域的重排序规则 对于 final 域,编译器和处理器要遵守两个重排序规则. 1)在构造函数内对一个 final 域的写入,与随后把这个被构 ...

  9. Java并发指南6:Java内存模型JMM总结

    本文转自 https://www.cnblogs.com/kukri/p/9109639.html 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库 ...

  10. java内存垃圾_Java内存区域与垃圾回收

    1,Java内存区域 1.1,运行时数据区域 java虚拟机在java的执行过程中将其管理的内存划分若干区域,有的随虚拟机进程的启动而一直存在,有的则依赖线程的启动和结束而建立和销毁. 1.1.1,程 ...

最新文章

  1. 互联网协议 — LISP 位置/身份分离协议
  2. android studio 设置自动编译_某小型公司持续集成工具jenkins实践(JAVA WEB、Android、IOS、html)...
  3. SQLite 函数大全
  4. Jmeter设置变量与引用变量(三)
  5. 安装百分之80卡住_新车买回来要不要安装发动机护板呢?装好还是不好?
  6. HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引
  7. Python基础七(函数)
  8. Hangfire项目实践分享
  9. 图数据库与关系数据库的实验对比——意大利商会 InfoCamere 案例
  10. CVPR 2019 神奇的超分辨率算法DPSR:应对图像模糊降质
  11. 语音识别论文.doc
  12. 深入浅出Python——Python高级语法之面向对象
  13. 使用GDI绘制一个类似进度条的控件(1)
  14. dell主板恢复出厂设置_DELL如何进入BIOS及恢复BIOS出厂设置
  15. IOS开发之逆向分析
  16. 知识树沉淀总结-领域驱动设计DDD
  17. 元宇宙营销新时代| 元宇宙数字营销峰会于7月29日在上海淳大万丽酒店盛大开幕!
  18. 题目:找出某种珍贵药材的生长区域
  19. Web的缓存加速(Squid的安装与配置)
  20. java中float、double和BigDecimal的精度问题(fastjson、Jackson以及实例化的方式)

热门文章

  1. 线程池的使用(线程池重点解析)
  2. Java源码分析之HashMap(JDK1.8)
  3. Neural Networks神经网络编程入门
  4. 如何在Hadoop上编写MapReduce程序
  5. Python爬虫实战(5):模拟登录淘宝并获取所有订单
  6. 鸟哥的Linux私房菜(基础篇)- Red Hat 6.x旧文件
  7. 递归求解1~9组成的特殊9位整数
  8. 【OpenCV3】cv::compare()使用详解
  9. 磁金融宣布完成1.2亿元B轮融资,宽带资本领投
  10. linux中文件名有英文括号的问题