并发编程笔记2

synchronized与volatile的区别

synchronized

  • 保证读写操作的原子性和可见性,通过锁机制实现线程安全
  • 可修饰方法(静态/非静态)或代码块
  • 非静态方法锁为对象锁,静态方法锁为类锁
  • 锁升级过程:无竞争时偏向锁 → 竞争时轻量级锁 → 持续竞争升级为重量级锁(不可逆)

volatile

  • 仅保证可见性和禁止指令重排序,不保证原子性
  • 只能修饰变量
  • 底层通过Lock前缀指令强制缓存回写,并触发MESI协议使其他处理器缓存失效

内存模型与线程交互

JVM内存区域

  • 方法区:存储类信息、静态变量(JDK 8后由元空间替代)
  • 堆:存储对象实例,多线程共享
  • 栈:存储方法调用帧与局部变量,线程私有

多线程数据访问

  • 共享堆内存变量需通过同步机制(如synchronized)保证安全
  • 每个线程拥有独立的工作内存(缓存),volatile强制数据刷新到主内存

volatile实现原理

硬件级机制

  1. Lock前缀指令

    • 触发处理器缓存回写到主内存
    • 现代CPU通过缓存锁定(非总线锁定)实现高效独占
  2. 缓存一致性协议(MESI)

    • 监听总线操作,发现共享变量被修改时使本地缓存失效
    • 下次读取时强制从主内存重新加载

局限性

  • 无法解决写后读的竞态条件(如i++需配合synchronized或原子类)

锁的优化与问题

synchronized锁升级

  • 偏向锁:单线程无竞争时直接获取
  • 轻量级锁:竞争轻微时通过CAS自旋尝试
  • 重量级锁:竞争激烈时线程阻塞,依赖操作系统互斥量

锁的副作用

  • 重量级锁导致上下文切换开销
  • 非静态方法锁影响同一实例的其他同步方法
  • 静态方法锁影响整个类的同步方法

原子类与CAS问题

Java原子类

  • AtomicIntegerAtomicReference等基于CAS实现
  • 适用场景:计数器、状态标志等轻量级同步

CAS三大问题

  1. ABA问题
    • 解决方案:使用版本号(如AtomicStampedReference
  2. 循环时间长开销大
    • 自旋CAS可能消耗CPU资源
  3. 只能保证单个变量原子性
    • 复合操作需借助锁或AtomicReference

指令重排序与并行机制

流水线并行

  • CPU将指令拆分为多个阶段(取指、译码、执行等)
  • 不同指令的阶段可并行执行以提高吞吐量

重排序规则

  • 编译器/处理器在不改变单线程语义的前提下优化指令顺序
  • 数据依赖性(如写后读)会阻止重排序

内存屏障

  • volatile通过插入屏障禁止特定重排序
  • 确保修改对其他线程立即可见
相关推荐
Engineer邓祥浩12 分钟前
JVM学习笔记(5) 第二部分 自动内存管理 第4章 虚拟机性能监控、故障处理工具
jvm·笔记·学习
智者知已应修善业31 分钟前
【51单片机4个IO实现16按键可扩展独立按键64矩阵驱动显示矩阵原值】2023-5-8
c++·经验分享·笔记·算法·51单片机
深蓝海拓33 分钟前
S7-1500学习笔记:Array数据类型
笔记·学习·plc
Xudde.9 小时前
班级作业笔记报告0x04
笔记·学习·安全·web安全·php
zzh08111 小时前
MySQL高可用集群笔记
数据库·笔记·mysql
绛橘色的日落(。・∀・)ノ11 小时前
Matplotlib实践学习笔记
笔记·学习
chase。12 小时前
【学习笔记】AGILE:把人形机器人强化学习从“玄学”变成“工程学”
笔记·学习·敏捷流程
久菜盒子工作室12 小时前
高等教育学|第一章高等教育概述
经验分享·笔记·课程设计
tq108612 小时前
语言流形与思维共生:中西认知图景的差异与交融
笔记
YuanDaima204812 小时前
基于 LangChain 1.0 的检索增强生成(RAG)实战
人工智能·笔记·python·langchain·个人开发·langgraph