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

article/2025/11/7 11:16:19

JAVA代码在编译后会变成字节码,字节码被类加载器加载到JVM中,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,JAVA中所使用的并发机制依赖于JVM的实现CPU的指令

->参考《JAVA并发编程的艺术》

1.volatile的应用

volatile是轻量级的synchronized,它只是用来保证共享变量的可见性,不能保证操纵的原子性。

【引申】–>volatile如何实现内存可见性?

  • 深入的说,通过加入内存屏障禁止重排序优化实现的。
  • 对volatile变量执行写操作时,会在写操作后加入一条store屏障指令。
  • 对volatile变量执行读操作时,会在读操作前加入一条load屏障指令。

1.1—volatile保证共享变量可见性

有volatile修饰的变量进行写操作的时候会多出一行汇编代码,该行代码会有一个lock指令。

volatile的两条实现原则:

①: Lock前缀指令会引起处理器缓存会写到内存(使处理器独占任何共享内存)。

②:一个处理器的缓存回写会导致其他处理器的缓存无效。

2.synchronized的实现原理和应用

⑴ synchronized实现同步的基础:

①:对于普通方法,锁是当前实例对象。

②:对于静态同步方法,锁是class对象。

③:同步方法块,锁是synchronized后面括号里的对象。

⑵ JVM规范中的实现原理

JVM基于进入和退出Monitor对象实现方法同步和代码块的同步

⑶Mark Word标记位

synchronized用到的锁是放在JAVA对象头里面的,其中有个Mark Word来存储对象的hashcode、分代年龄和锁标记位,其中锁标记位会产生变化,对应的不同的标记,我们的锁有3种:轻量级锁、重量级锁、偏向锁

⑷锁的升级与对比

从SE 1.6开始,锁一共有四种状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。

①:偏向锁

引入原因:大多数情况下,锁仅有某一线程多次获得,为了使获得锁的代价更低而引入偏向锁。

偏向锁的设置:当某一线程访问同步块时,会在对象头和栈帧中的琐记录里存储锁偏向的线程ID,以后该线程在进入该同步块的时候,不需要再次使用CAS原子操作进行加锁和解锁,只需要简单的测试一下对象头中的Mark Word是否存在指向当前线程的偏向锁。如果测试成功,则表示获得锁,否则检测是否设置有偏向锁,如果没有,则使用CAS竞争锁,否则偏向锁指向该线程。

偏向锁的关闭:在6和7中是默认采用的,可以通过JVM参数关闭:UseBiaseLocking=false,此时程序进入轻量级锁的状态。

②:轻量级锁

加锁:线程执行同步块之前,会在线程私有的栈帧中开辟用于存储锁记录的空间,称为Displaced Mark Word。然后线程尝试将对象Mark Word的替换为指向Displaced Mark Word记录的指针,如果成功,那么当前线程获得锁,如果失败,那么使用自旋获得锁。

何为自旋?

这里写图片描述

轻量级锁解锁: 使用原子的CAS操作将Displaced Mark Word 替换回对象头,如果成功,表示没有竞争发生,否则,说明当前锁存在竞争(从上图可以看出,竞争锁的线程一直在尝试修改Mark Word,这肯定存在竞争),锁就会膨胀成重量级的锁。

因为自旋会消耗CPU,为了避免太多无用的自旋,一旦锁膨胀成重量级的锁,便不会再恢复到轻量级的锁的状态。当锁处于这个状态下,其他线程试图获取锁时就被阻塞住。当锁释放时再唤醒这些线程。此时醒来的线程就会进行一轮新的竞争。

三种锁的比较:

优点缺点使用场景
偏向锁加锁和解锁不需要额外的消耗,和执行非同步方法之间存在纳秒级的差距线程间存在锁的竞争,会带来额外的锁撤销的消耗适用于只有一个线程访问同步块的场景
轻量级锁竞争的线程不会阻塞,提高程序的响应速度自旋消耗CPU追求响应时间,同步块执行速度快
重量级锁线程竞争不使用自旋,不消耗CPU线程阻塞,响应时间慢追求吞吐量,同步块执行速度较长

3.原子操作的实现原理

⑴处理器实现原子操作的机制:

第一机制:总线锁(声言Lock信号)

第二机制共享缓存锁(修改内存地址,缓存一致性机制:阻止同时修改由2个以上的处理器缓存的内存区域数据)。

⑵JAVA实现原子操作的机制

第一个是循环CAS:JVM中的CAS操纵是利用了处理器提供的CMPXCHG指令实现的。自旋CAS的基本思路是循环进行CAS操作,直到CAS操作成功了为止。

⑶使用锁机制实现原子操作

锁机制保证只有获得锁的线程才能够操作锁定的内存区域。注意:除了偏向锁,JVM实现锁的方式都用了循环CAS操作(使用循环CAS获取锁,使用循环CAS释放锁)。


http://chatgpt.dhexx.cn/article/wviEWcqc.shtml

相关文章

【2022最新Java面试宝典】—— Java并发编程面试题(123道含答案)

目录 一、基础知识1. 为什么要使用并发编程2. 多线程应用场景3. 并发编程有什么缺点4. 并发编程三个必要因素是什么?5. Java 程序中怎么保证多线程的运行安全?6. 并行和并发有什么区别?7. 什么是多线程8. 多线程的好处9. 多线程的劣势&#x…

【JAVA并发】二、JAVA是如何解决并发问题的

上文提到了并发产生的原因,那么JAVA给出的解决方案是什么呢,我们来一起探讨一下。 一、解决缓存导致的并发问题 针对于这个问题,原因主要是各个缓存之间的数据可见性的问题。那么解决这个问题的最简单粗暴的思路就是禁用缓存。 试想一下&am…

java并发编程Future类详解

作用和举例 future类的作用就是为了调用其他线程完成好后的结果,再返回到当前线程中,如上图举例: 小王自己是主线程,叫外卖等于使用future类,叫好外卖后小王就接着干自己的事去了,当外卖到了的时候&#x…

Java并发工具CountDownLatch使用详解

本文目录 1、使用场景2、使用介绍3、使用案例4、 Thread.join()和CountDownLatch的区别 1、使用场景 通过使用 CountDownLatch可以使当前线程阻塞,等待其他线程完成给定任务。可以类比旅游团导游要等待所有的游客到齐后才能去下一个景点。 CountDownLatch 主要应用…

Java 并发编程(一):简介

这篇文章的标题原本叫做——Java 并发编程(一):简介,作者名叫小二。但我在接到投稿时觉得这标题不够新颖,不够吸引读者的眼球,就在发文的时候强行修改了标题(也不咋滴)。 小二是一名 Java 程序员&#xff…

Java并发编程的艺术下载

本书简介 并发编程领域的扛鼎之作,作者是阿里和1号店的资深Java技术专家,对并发编程有非常深入的研究,《Java并发编程的艺术》是他们多年一线开发经验的结晶。本书的部分内容在出版早期发表在Java并发编程网和InfoQ等技术社区,得…

Java并发工具之Semaphore

一、简介 摘自《Java并发编程的艺术》一书 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。 Semaphore一般用于流量的控制,特别是公共资源有限的应用场景。例…

Java 并发编程实战-创建和执行任务的最佳实践

若无法通过并行流实现并发,则必须创建并运行自己的任务。运行任务的理想Java 8方法就是CompletableFuture。 Java并发的历史始于非常原始和有问题的机制,并且充满各种尝试的优化。本文将展示一个规范形式,表示创建和运行任务的最简单&#x…

java并发-java并发大师

文章目录 java并发大师James GoslingDoug Lea 参考 java并发大师 聊聊java(十)Java并发大师Brain Goetz和Doug Lea 的中英文博客文章地址 参考URL: https://blog.csdn.net/weixin_33963594/article/details/92481739 James Gosling 技术大牛收割机&am…

java并发编程之 并发问题及解决方法

一、并发问题的根源 首先,我们要知道并发要解决的是什么问题?并发要解决的是单进程情况下硬件资源无法充分利用的问题。而造成这一问题的主要原因是CPU-内存-磁盘三者之间速度差异实在太大。如果将CPU的速度比作火箭的速度,那么内存的速度就…

『图解Java并发编程系列』10张图告诉你Java并发多线程那些破事

目录 线程安全问题 活跃性问题 性能问题 有态度的总结 头发很多的程序员:『师父,这个批量处理接口太慢了,有什么办法可以优化?』架构师:『试试使用多线程优化』第二天头发很多的程序员:『师父&#xff…

Java基础-并发篇

3.1. JAVA 并发知识库 3.2. JAVA 线程实现/创建方式 3.2.1. 继承 Thread 类 ​ Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方 法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法,它将…

java并发总结

一、并发基础 ㅤ 1、进程与线程 ㅤ 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 I…

pytorch 图片分类,python 图片分类,resnet18 图片分类

pytorch 图片分类,python 图片分类,resnet18 图片分类,深度学习 图片分类 pytorch版本:1.5.0cu101 全部源码,可以直接运行。 下载地址:https://download.csdn.net/download/TangLingBo/12598435 网络是…

深度学习图片分类实战学习

开始记录学习深度学习的点点滴滴 深度学习图片分类实战学习 前言一、深度学习二、使用步骤1. 自建网络模型2. 进行深度学习的学习迁移 注意事项 前言 随着人工智能的不断发展,这门技术也越来越重要,很多人都开启了学习人工智能,本人开始记录…

关于图片的多标签分类(1)

最近还在处理人脸附件(眼镜,刘海,口罩,帽子)的multi-label分类。给自己普及一下常识性问题: 1)什么是multi-label分类? multi-label分类,常见一张图片中可以存在多个目…

svm实现图片分类(python)

目录 前言 knn vs. svm svm & linear classifier bias trick loss function regularization optimization 代码主体 导入数据及预处理 svm计算loss_function和梯度 验证梯度公式是否正确 比较运行时间 svm训练及预测,结果可视化 通过corss-validat…

图片分类-python

目的:做一个简易的图片分类。 使用到的算法:hog、surfsvm 图片集:cifar-10、cifar-100、stl-10、自制图片集 分类完整代码链接 使用说明: 1.cifar-10、cifar-100和stl-10直接解压 2.自制图片集文件夹结构: ├…

CNN图片分类

最近在阅读一些AI项目,写入markdown,持续更新,算是之后也能回想起做法 项目 https://github.com/calssion/Fun_AI image classify(图片分类) CNN classify dogs and cats(猫狗二分类) Tutorial(教程):https://developers.google.com/mach…

深度学习之图像分类

第一篇CSDN文章,写的不好,还请各位大佬指正。万事开头难,千里之行始于足下! 1.什么是图像分类 图像分类,核心是从给定的分类集合中给图像分配一个标签的任务。实际上,这意味着我们的任务是分析一个输入图…