Java并发机制的底层实现原理

Chapter 2 第2 章

Java 并发机制的底层实现原理

Java 代码在编译后会变成 Java 字节码,字节码被类加载器加载到 JVM 里,JVM 执行字

节码,最终需要转化为汇编指令在 CPU 上执行 ,Java 中所使用的并发机制依赖于 JVM 的实

现和 CPU 的指令。本章我们将深入底层一起探索下 Java 并发机制的底层实现原理。

2.1 volatile 的应用

在多线程并发编程中 synchronized 和 volatile 都扮演着重要的角色,volatile 是轻量级的

synchronized ,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线

程修改一个共享变量时,另外一个线程能读到这个修改的值。如果 volatile 变量修饰符使用

恰当的话,它比 synchronized 的使用和执行成本更低,因为它不会引起线程上下文的切换和

调度。本文将深入分析在硬件层面上 Intel 处理器是如何实现 volatile 的,通过深入分析帮助

我们正确地使用 volatile 变量。

我们先从了解 volatile 的定义开始。

1. volatile 的定义与实现原理

Java 语言规范第 3 版中对 volatile 的定义如下 :Java 编程语言允许线程访问共享变量,

为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。

Java 语言提供了 volatile ,在某些情况下比锁要更加方便。如果一个字段被声明成 volatile ,

Java 线程内存模型确保所有线程看到这个变量的值是一致的。

在了解 volatile 实现原理之前 ,我们先来看下与其实现原理相关的 CPU 术语与说明。

第2 章 Java 并发机制的底层实现原理   9

表 2-1 是 CPU 术语的定义。

表2-1 CPU 的术语定义

术  语 英文单词 术语描述

内存屏障 memory barriers 是一组处理器指令,用于实现对内存操作的顺序限制

缓存中可以分配的最小存储单位。处理器填写缓存线时会加载整个

缓冲行 cache line

缓存线,需要使用多个主内存读周期

原子操作 atomic operations 不可中断的一个或一系列操作

当处理器识别到从内存中读取操作数是可缓存的,处理器读取整个

缓存行填充 cache line f ill

缓存行到适当的缓存(L1 ,L2 ,L3 的或所有)

如果进行高速缓存行填充操作的内存位置仍然是下次处理器访问的

缓存命中 cache hit

地址时,处理器从缓存中读取操作数,而不是从内存读取

当处理器将操作数写回到一个内存缓存的区域时,它首先会检查这

个缓存的内存地址是否在缓存行中,如果存在一个有效的缓存行,则

写命中 write hit

处理器将这个操作数写回到缓存,而不是写回到内存,这个操作被称

为写命中

写缺失 write misses the cache 一个有效的缓存行被写入到不存在的内存区域

volatile 是如何来保证可见性的呢?让我们在 X86 处理器下通过工具获取 JIT 编译器生

成的汇编指令来查看对 volatile 进行写操作时,CPU 会做什么事情。

Java 代码如下。

instance = new Singleton(); //

java并发机制_Java并发机制的底层实现原理.PDF相关推荐

  1. java底层原理书籍_阿里面试题:Java中this和super关键字的底层实现原理

    知道的越多,不知道的就越多,业余的像一棵小草! 编辑:业余草 来源:https://www.xttblog.com/?p=5028 B 站:业余草 最近一个粉丝加我说,接到了阿里的面试,问问我阿里会面 ...

  2. java cas机制_java并发编程中的CAS机制,你理解嘛?

    学习Java并发编程,CAS机制都是一个不得不掌握的知识点.这篇文章主要是从出现的原因再到原理进行一个解析.希望对你有所帮助. 一.为什么需要CAS机制? 为什么需要CAS机制呢?我们先从一个错误现象 ...

  3. java并发排它锁_Java并发编程进阶——锁(解析)

    一.锁是什么 java开发中进行并发编程时针对操作同一块区域时,如果不加锁会出现并发问题,数据不是自己预计得到的值.我觉得有点像mysql事务中脏读.不可重复读.幻读的问题.加锁的目的是为了保证同一时 ...

  4. java 并发锁_Java并发教程–锁定:内在锁

    java 并发锁 在之前的文章中,我们回顾了在不同线程之间共享数据的一些主要风险(例如原子性和可见性 )以及如何设计类以安全地共享( 线程安全的设计 ). 但是,在许多情况下,我们将需要共享可变数据, ...

  5. java 反射代价_Java反射机制

    # 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...

  6. 说一下java的运行机制_Java运行机制是什么?

    不管是学习Java还是其他什么变成语言,我们不仅要了解它的特性,充分的使用Java语言完成各种程序开发工作,还要了解Java的运行机制.只有了解其底层的运行机制,才能更好的利用Java完成各项工作.J ...

  7. java 抛出异常效率_Java异常处理机制

    与C++.python,Ruby一样,Java也有一个异常处理机制,当程序出现异常时,系统会自动生成一个Exception对象通知程序去处理.之所以这样设计目的在于使程序有更好的容错性和可读性,实现业 ...

  8. java并发常量_Java并发编程-常量对象(七)

    在创建后状态不再发生改变的对象称作常量对象(Immutable Objects).常量对象其可靠性使其广泛地用作开发简单可靠代码的策略.常量对象在开发并发程序中非常有用.由于创建后不能被改变状态,它们 ...

  9. java的 内省机制_Java 内省机制

    Java 内省机制 一.内省机制概述 ​ Java 中的反射机制是通过名称得到类的方法和对象的成份,对于一切 Java 类都是适用的,但是有时候使用起来比较麻烦.而 JavaBean 是一种特殊的 J ...

  10. java心跳机制_Java 心跳机制实现 DOM

    心跳机制 心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制. 大部分CS的应用需要心跳机制.心跳机制一般在Server和Client都要实现,两者实现原理 ...

最新文章

  1. Axure RP使用攻略--入门级(五)系统函数与变量
  2. 程序员读研如何提高技术之我见
  3. boost::ratio_less_equal相关的测试程序
  4. python观察日志(part16)--收集关键词参数
  5. 使用thead,tbody,tfoot来实现表格的分页打印
  6. 矩阵运算_Sophus库的使用
  7. 基于Kinect 2.0深度摄像头的三维重建 and Kinect Fusion
  8. 数据分析案例-航空公司客户价值分析(聚类)
  9. 4g dtu无线透明通讯模块传输RS232/485手机APP全网通CAT1
  10. java 时分秒加减_JAVA日期加减运算
  11. 电力系统风力发电机组测控专用隔离变送器
  12. 思岚科技邀您体验智能黑科技 届时将惊现明星大咖!
  13. cent7虚拟机镜像_centos7.3系统下载
  14. FLAG_DISMISS_KEYGUARD FLAG_SHOW_WHEN_LOCKED
  15. redis查询所有key值,redis清除所有key值
  16. 产品+经理,就是最奇妙的化学组合
  17. 计算机操作系统例题总结
  18. python 怎么输入单引号_在python中如何输入单引号
  19. oracle监听程序如何关闭,如何关闭ORACLE监听器日志
  20. 1_svn版本控制客户端下载,安装,安装中文包使用

热门文章

  1. 图文详解 | 万用表的使用与口诀!十足干货,不要错过!
  2. google身份验证器
  3. 用matlab求状态转移矩阵(给定t)
  4. 系统思考:VUCA时代下的我们应该怎么做?
  5. python 词云(Word Cloud)设计
  6. 今日恐慌与贪婪指数为22 恐慌程度有所缓解
  7. Ajax传递二维数组至后台ThinkPHP控制器
  8. fighting_使用CSS美化文字
  9. jQuery动画效果——淡入淡出
  10. help指令和man指令的区别