`

Java多线程高并发进阶篇(一)-volatile实现原理剖析

阅读更多

我们知道,在JVM的类加载机制中,是将外围的源码文件编译成字节码文件(.class)后加载到JVM中,然后Java通过执行引擎执行字节码,最终转化为汇编指令由CPU执行.我们说的并发编程机制,当然离不开JVM的实现和CPU的指令集.

了解JMM(Java Memory Model,Java内存模型)都知道,JMM是围绕着原子性,有序性,可见性展开的.后面我会专门写一篇,阐述Java内存模型以及它与处理器内存模型,以及顺序一致性内存模型的关系.

1.volatile的定义

在Java语言规范中,对volatile的定义如下:

Java编程语言允许线程访问共享变量,为了确保共享变量能准确的访问一致性的更新,线程应该确保通过排它锁单独获得这个变量,因此Java语言提供了volatile.如果一个变量被定义为volatile,那么Java线程的内存模型(也叫线程的本地内存)看到这个变量的内容是一致的.换句话说,Java语言提供volatile,是为了保证线程之间共享变量的可见性.

 

2.volatile的实现原理

在了解volatile之前,我们需要明白CPU中的一些专业术语.


 

在了解了上面的专业术语后,我们就了解下volatile如何保证可见性.

有volatile修饰的共享变量在进行写操作时,转变成汇编指令时,会多出一行lock addl $0×0,(%esp);

 

lock前缀指令在多核处理器下会引发两件事情:

①将当前处理器缓存行的数据全部写回到系统内存(JMM中的主内存).

②在这个写回主内存的操作会使在其他处理器(CPU)中缓存了该内存地址的数据无效.

这里我们解释一下.

为了提高处理速度,处理器不直接和主内存进行通信,而是先将主内存的数据读取到处理器的内部缓存中(一级或二级缓存或其他).如果对声明了volatile的变量进行写操作,JVM就会向处理器发送一条lock前缀的指令,如红色字体部分,然后将这个变量所在的缓存行数据写回到主内存.如果其他处理器缓存的该共享变量的值还是旧的,那么后续的操作就会有问题.因此,在多处理器情况下,为了保证各个处理器缓存该共享变量的内容一致,就需要根据缓存一致性协议,每个处理器通过嗅探总线上传播的数据来检查自己的缓存行是否过期了,如果发现过期了,就会把自身存储该共享变量的缓存行置为无效状态,当处理器需要对这个数据进行修改操作时,那么就需要去主内存重新读取这个共享变量的值,此时当然读取到的是上一个处理器修改过的内容了.

 

3.关于volatile实现原理两条原则的详述

在2中,我们说到了lock指令在多处理器情况下引发的两件事情.我们来具体介绍下这两件事情.

①lock指令会引起理器存回写到内存

旧型号的处理器中,Lock前缀指令执行期间,会声言一个LOCK#信号,该信号确保处理器在指令执行期间,可以独占共享内存(也就是主内存).当一个处理器在总线上声言LOCK#信号时,其他处理器的请求将会被阻塞.这种方式叫"总线锁"

但是在最新型号的处理器中,不再使用LOCK#信号锁总线,而是锁缓,因为锁总线的开销太大了.如果处理器访问的内容已经缓存在处理器内部,它会锁定该内容所在的内存区域的缓存行,并将该缓存行内容写回到共享内存(也就是主内存),并使用缓存一致性协议保证修改的原子性,这个过程叫做"缓存锁定".

这里要说明一点:存一致性机制会阻止同修改由两个以上理器存的内存区域数据。

一个理器的存回写到主内存会致其他理器的存无效

在处理器中,使用MESI(修改,独占,共享,无效)控制协议 ,去维护处理器内部的缓存和其他处理器的缓存一致性.在多核处理器系统中,处理器能嗅探到其他处理器访问主内存以及它们的内部缓存.处理器使用嗅探技术保证它的内部缓存,主内存,其他处理器的缓存的数据跟总线上保持一致.

比如,PentiumP6 family理器中,如果一个器通过嗅探检测到其他理器打算将共享变量回写到主内存地址,那么个地址对于缓存了该数据缓存行的处理器来说于共享状态,这个处理器就会把自身处理器缓存中对应的缓存数据行置为无效状态.

 

来一张图,让蒙圈的小伙伴们醒醒.JMM的内存结构示意图.



 

  • 大小: 164.1 KB
  • 大小: 53.3 KB
分享到:
评论

相关推荐

    Java 多线程与并发(5-26)-关键字- volatile详解.pdf

    Java 多线程与并发(5_26)-关键字_ volatile详解

    Java并发编程系列- volatile

    Java并发编程系列- volatile;Java并发编程系列- volatile;Java并发编程系列- volatile;Java并发编程系列- volatile;Java并发编程系列- volatile;

    Java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-...

    java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 ...

    java多线程笔记

    Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java...

    Java 线程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 ...

    Java-并发(Concurrent)编程

    4,多线程在JVM中的实现原理剖析 导语: 什么是多线程? 多线程(multithreading)是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而...

    VLSI-Design of Non-Volatile Memories

    The electronics and information technology revolution continues, but it is a critical time in the development of technology. Once again, we stand on the brink of a new era where emerging research will...

    java 高并发中volatile的实现原理

    主要介绍了java 高并发中volatile的实现原理的相关资料,在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”,需要的朋友...

    Java多线程(Synchronized+Volatile+JUC 并发工具原理+线程状态+CAS+线程池)

    Java多线程(Synchronized+Volatile+JUC 并发工具原理+线程状态+CAS+线程池)

    Java多线程和并发知识整理

    1.1为什么需要多线程 1.2不安全示例 1.3并发问题的根源 1.4JMM 1.5线程安全的分类 1.6线程安全的方法 二、线程基础 2.1状态 2.2使用方式 2.3基础机制 2.4中断 2.5互斥同步 2.6线程合作 三、...

    Java 并发核心编程

    这篇指南主要是为帮助java多线程开发人员理解并发的核心概念以及如何应用这些理念。本文的主题是关于具有java语言风格的Thread、synchronized、volatile,以及J2SE5中新增的概念,如锁(Lock)、原子性(Atomics)、并发...

    2023年最新Java高并发多线程面试题

    内容概要:最新2023年Java高并发多线程后端面试题整理, 包含线程池,并发集合,volatile,CountDownLatch,Semaphore,Phaser,AQS,ReentrantLock,ReentrantLock等等问题, 用简洁明了的语言,通俗易懂地阐述了高...

    java进阶13天资料.zip

    Java进阶13天资料 day01-复习回顾、静态、继承、引用类型使用 day02-抽象类、接口、代码块,final、单例、枚举 day03-多态、包、权限修饰符、内部类,Object类,Date类 day04-常用API、正则表达式,泛型、Collection...

    ISSCC2021_Session_30V_Non-Volatile Memory.pdf

    ISSCC2021_Session_30V_Non-Volatile Memory.pdf

    在线 Java 硕士加薪课程 Term-05 班 (10.68G)

    2.Day02-线程并发原理 ---【课时1】01-如何理解线程并行与并发.mp4 ---【课时10】10-死锁分析.mp4 ---【课时11】11-线程通讯简介.mp4 ---【课时12】12-进程内线程通讯实现(手写阻塞式队列).mp4 ---【课时2】02-如何...

    并发编程-volatile使用精讲.pdf

    并发编程-volatile使用精讲.pdf

Global site tag (gtag.js) - Google Analytics