线程安全级别

级别 描述 示例
不可变(Immutable) 对象状态不可变,天然线程安全。 StringInteger
绝对线程安全 所有操作都线程安全(Java 中极少见)。 Vector(通过同步实现,但复合操作仍不安全)
相对线程安全 单次操作线程安全,复合操作需同步。 Collections.synchronizedList()
线程兼容 需调用方通过同步保证安全。 ArrayList
线程对立 无论是否同步都无法保证安全(设计错误)。 未正确同步的共享变量

线程安全的实现方式

互斥同步(Mutual Exclusion)

  • 核心机制:通过锁(如 synchronizedReentrantLock)保证临界区代码的原子性

  • 底层原理

    • synchronized:基于对象头中的 Mark WordMonitor 锁实现

      // HotSpot 虚拟机对象头(64位)
      Mark Word (64 bits): [锁状态标志 | 线程ID | 分代年龄 | ...]
    • 锁状态:无锁 → 偏向锁 → 轻量级锁 → 重量级锁

    • ReentrantLock:基于 AQS(AbstractQueuedSynchronizer) 实现,支持公平/非公平锁

非阻塞同步(Non-Blocking)

  • 核心机制:通过 CAS(Compare-And-Swap) 实现无锁编程
  • CAS 指令AtomicIntegerAtomicReference 等类的底层实现
  • ABA 问题:通过 AtomicStampedReference 解决
  • 硬件支持:x86 架构的 cmpxchg 指令

锁优化策略

偏向锁(Biased Locking)

  • 目的:减少无竞争场景下的同步开销
  • 原理:记录首个获取锁的线程 ID,后续该线程无需 CAS 操作即可直接进入临界区
  • 适用场景:单线程重复访问锁
  • 参数-XX:+UseBiasedLocking(默认开启)

轻量级锁(Lightweight Locking)

  • 目的:减少多线程轻度竞争时的锁开销
  • 原理:通过 CAS 操作将对象头替换为线程栈指针,避免操作系统级阻塞
  • 适用场景:低并发竞争(如两个线程交替访问)

自旋锁(Spin Lock)

  • 目的:减少线程阻塞和唤醒的上下文切换开销
  • 原理:线程在竞争锁时循环等待(自旋),而非立即挂起
  • 参数-XX:PreBlockSpin=10(默认自旋 10 次后升级为阻塞)

锁消除(Lock Elimination)

  • 目的:去除无实际竞争场景下的冗余锁
  • 原理:JIT 编译器通过 逃逸分析,若发现锁对象仅被当前线程使用,直接删除锁操作

锁粗化(Lock Coarsening)

  • 目的:减少频繁加锁/解锁的开销
  • 原理:合并多个连续的锁操作为一个更大的锁范围

适应性自旋(Adaptive Spinning)

  • 目的:动态调整自旋策略,平衡 CPU 资源消耗
  • 原理:根据历史自旋成功率和锁持有时间,动态调整自旋次数或直接阻塞

重量级锁(Heavyweight Locking)

  • 目的:解决高并发竞争下的线程安全
  • 原理:依赖操作系统互斥量(mutex)和条件变量(condition variable),直接阻塞竞争线程
  • 适用场景:多线程高竞争(如秒杀场景)

深入理解Java虚拟机-线程安全与锁优化的更多相关文章

  1. Java虚拟机--线程安全和锁优化

    Java虚拟机--线程安全和锁优化 线程安全 线程安全:当多线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象 ...

  2. 深入理解JVM(7)——线程安全和锁优化

    Java中的线程安全 按照线程安全的“安全程度”由强至弱来排序,可以将Java语中各种操作共享的数据分为以下5类:不可变. 绝对线程安全. 相对线程安全. 线程兼容和线程对立. 1.不可变 不变的对象 ...

  3. JVM之java并发 ——线程安全与锁优化

    概述 人们很难想象现实中的对象在一项工作进行期间,会被不停地中断和切换,对象的属性(数据)可能会在中断期间被修改和变“脏”,而这些事情在计算机世界中则是很正常的事情.有时候,良好的设计原则不得不向现实 ...

  4. 深入理解Java虚拟机(九)——后端编译与优化

    即时编译器 Java程序最初都是通过解释器进行执行,当发现某个方法或者代码块被运行得非常频繁,这些代码就被认为是热点代码,为了提高这些代码得运行效率,虚拟机会把热点代码编译成本地机器码,并进行优化,运 ...

  5. 深入理解java虚拟机(7)---线程安全 & 锁优化

    关于线程安全的话题,足可以使用一本书来讲解这些东西.<Java Concurrency in Practice> 就是讲解这些的,在这里 主要还是分析JVM中关于线程安全这块的内容. 1. ...

  6. 深入理解java虚拟机-第13章-线程安全与锁优化

    第十三章 线程安全与锁优化 线程安全 java语言中的线程安全 1 不可变.Immutable 的对象一定是线程安全的 2 绝对线程安全 一个类要达到不管运行时环境如何,调用者都不需要额外的同步措施, ...

  7. 《深入理解Java虚拟机》-----第13章 线程安全与锁优化

    概述 在软件业发展的初期,程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和解 ...

  8. 【深入理解JAVA虚拟机】第5部分.高效并发.2.线程安全和锁优化

    1 概述 对于这部分的主题“高效并发”来讲,首先需要保证并发的正确性,然后在此基础上实现高效. 2 线程安全 <Java Concurrency In Practice> 的作者Brian ...

  9. 深入理解Java虚拟机(第三版)-14. 线程安全与锁优化

    14. 线程安全与锁优化 1. 什么是线程安全? 当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替进行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个 ...

  10. 《深入了解java虚拟机》高效并发读书笔记——Java内存模型,线程,线程安全 与锁优化

    <深入了解java虚拟机>高效并发读书笔记--Java内存模型,线程,线程安全 与锁优化 本文主要参考<深入了解java虚拟机>高效并发章节 关于锁升级,偏向锁,轻量级锁参考& ...

随机推荐

  1. G1原理—8.如何优化G1中的YGC

    大纲 1.5千QPS的数据报表系统发生性能抖动的优化(停顿时间太小导致新生代上不去) 2.由于产生大量大对象导致系统吞吐量降低的优化(大对象太多频繁Mixed GC) 3.YGC其他相关参数优化之TL ...

  2. 深入解析 Spring AI 系列:解析函数调用

    我们之前讨论并实践过通过常规的函数调用来实现 AI Agent 的设计和实现.但是,有一个关键点我之前并没有详细讲解.今天我们就来讨论一下,如何让大模型只决定是否调用某个函数,但是Spring AI ...

  3. 让你看懂dart中静态成员和继承

    静态属性和静态方法 在dart中,我们可以通过关键字 static来定义静态属性和静态方法. 需要注意的是: 静态方法不能访问非静态属性[结论1] 非静态方法可以访问静态成员[结论2] 我们通过下面的 ...

  4. Netty实战入门教程

    概述 Netty 是一个异步的.基于事件驱动的网络应用框架,用于快速开发可维护.高性能的网络服务器和客户端 Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开 ...

  5. Apache Amoro数据湖管理和治理工具部署

    一.Amoro介绍 2024 年 3 月 11 日,Amoro 项目顺利通过投票,正式进入 Apache 软件基金会(ASF,Apache Software Foundation)的孵化器,成为 AS ...

  6. Luogu P10838 『FLA - I』庭中有奇树 题解 [ 绿 ] [ 二分 ] [ 双指针 ] [ 树的遍历 ]

    庭中有奇树:很多算法揉在一起的好题. 转化题意 因为要封锁 \(m\) 条路径,根据贪心思想,他一定会封锁最短的 \(m\) 条路径.所以我们能走的最短传送路径就是最短的第 \(m+1\) 条路径. ...

  7. flutter ios 深色模式下状态栏文字是白色的,白色背景下看不见

    flutter ios 深色模式下状态栏文字是白色的,白色背景下看不见 theme: ThemeData( appBarTheme: const AppBarTheme( systemOverlayS ...

  8. WPF 线程处理

    参考链接:https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-3.5/ms771750(v=vs.90)

  9. DeepSeek “源神”启动!「GitHub 热点速览」

    ​上周,DeepSeek 官方宣布将陆续发布 5 个开源项目.本周一开源社区就迎来了首发之作--FlashMLA!该项目开源后,不到一天 Star 数已突破 6k,并且还在以惊人的速度持续飙升. Gi ...

  10. KaFka 安装与基本使用

    学了有一段时间的大数据了,学习新的组件,大部分安装可以分为三步:上传解压,配置文件,启动. 分享一下我的kafka安装包: 链接:https://pan.baidu.com/s/1fbydwZwcYy ...