Java中的volatile和synchronize

本文深入探讨Java中的Volatile关键字和Synchronized机制,解析其在并发编程中的作用与实现原理,包括内存屏障、缓冲行、比较并交换等关键概念,以及轻量级锁、重量级锁的对比,帮助理解Java并发控制的核心机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java中的volatile和synchronize

相关术语

名称英文释义
内存屏障memory barriers对内存操作的顺序限制
缓冲行cache lineCPU高速缓存中可以分配的最小存储单位
比较并交换Compare and swapCAS操作输入两个数值,旧值没有发生变化,才交换新值
CPU流水线CPU pipeline实现在一个CPU时钟周期完成一条指令

volatile的定义及实现

  1. 定义:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。
  2. 实现原则:使用Lock汇编码,Lock前缀指令会引起处理器缓存回写到内存;一个处理器的缓存回写到内存回导致其他处理器的缓存无效。
  3. 使用优化:追加成64字节——Doug lea

synchronize的定义及实现

  1. 在JVM中的实现原理:给予进入和退出Monitor对象来实现方法同步和代码块同步,方法同步通过monitorenter和monitorexit指令实现。
  2. Java对象头:
    名称释义
    Mark Word存储对象的hashCode、锁信息、分代年龄
    Class Metadata Address对象类型数据的指针
    Arrat length数组长度

锁的升级

  1. 偏向锁:同一线程多次获得锁,在对象头和栈帧中的锁记录里存储偏向的线程ID。
    • 撤销:使用了等到竞争出现才撤销的机制
    • 关闭:通过设置JVM参数
  2. 轻量级锁:
    • 加锁:访问同步块->分配空间并复制Mark Word到栈->CAS修改Mark Word,成功则替换为轻量级锁,失败则自旋。
    • 解锁:使用CAS将Displaced Mark Word替换到对象头,若失败,表示锁存在竞争,升级为重量级锁。
  3. 三种锁的对比
    名称优点缺点场景
    偏向锁加锁解锁不许额外消耗若线程间存在锁竞争,会带来锁撤销的消耗使用以单一线程使用同步块
    偏向锁竞争的线程不会阻塞,提高相应速度自旋会消耗CPU追求相应时间,同步块执行速度非常快
    重量级锁献策好难过竞争不适用自旋,不消耗CPU线程阻塞,相应时间缓慢追求吞吐量,同步块执行时间长

原子操作的实现

  1. 实现机制:总线锁+缓存锁
  2. 总线锁:当处理器在总线上输出Lock信号,其他处理器的请求就被阻塞,该处理器可以独占共享内存
  3. 缓存锁:使用缓存一致性机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值