synchronize原理

本文详细介绍了Java中的`synchronized`关键字,包括其基于monitor enter/exit指令的锁机制,以及对象头的Mark Word在实现锁中的作用。文章还探讨了从无锁到重量级锁的升级过程,如偏向锁和轻量级锁的优化策略,旨在减少锁的开销。同时,解释了为何wait和notify方法必须在`synchronized`代码块中使用的原因,因为它们与监视器锁密切相关。

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

synchronized同步块使用了monitor enter和monitor exit指令实现同步,这两个指令,本质上都是对一个对象的监视器(monitor)进行获取,这个过程是排他的,也就是说同一时刻只能有一个线程获取到由synchronized所保护对象的监视器。

线程执行到monitor enter指令时,会尝试获取对象所对应的monitor所有权,也就是尝试获取对象的锁,而执行monitor exit,就是释放monitor的所有权。

在Hotspot虚拟机中,对象在内存中的布局分为三块区域:对象头(Mark Word、Class Metadata Address)、实例数据和对齐填充;Java对象头是实现synchronized的锁对象的基础。一般而言,synchronized使用的锁对象是存储在Java对象头里。它是轻量级锁和偏向锁的关键。

Monitor是一个同步工具,它内置于每一个Object对象中,相当于一个许可证。拿到许可证即可以进行操作,没有拿到则需要阻塞等待。在hotspot虚拟机中,通过ObjectMonitor类来实现monitor。

在JavaSE 1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的 偏向锁 和 轻量级锁 以及其它各种优化之后变得在某些情况下并不是那么重了锁的级别从低到高逐步升级: 无锁->偏向锁->轻量级锁->重量级锁。自旋锁与自适应自旋线程的挂起和恢复会极大的影响开销。并且jdk官方人员发现,很多线程在等待锁的时候,在很短的一段时间就获得了锁,所以它们在线程等待的

synchronize 关键字是用于实现线程同步的一种机制,其原理是通过在代码块或方法上加,来确保多个线程在执行该代码段时的互斥性。其实现原理如下: 1. 对象:synchronize 使用的对象可以是任意对象。当一个线程进入 synchronized 代码块时,它会尝试获取;如果没有被其他线程占用,则该线程获取,否则该线程将进入阻塞状态,直到被释放。 2. 对象监视器:在 Java 对象的内部数据结构中,每个对象都有一个关联的对象监视器。对象监视器负责管理的获取和释放,以及线程在对象上的等待和唤醒操作。当一个线程成功获取时,对象监视器会记录该线程的标识,并将对象的计数器加一。同时,其他线程在尝试获取时,将进入对象的等待队列,等待的释放。 3. 原子性操作:synchronize 关键字使得一些复合操作具有原子性。即当一个线程执行 synchronized 代码块时,其他线程无法同时进入该代码块,保证了多个线程对共享数据的同步访问。这样可以避免出现并发访问共享资源导致的数据不一致性和线程安全问题。 总之,synchronize 实现线程同步的原理是通过加和对象监视器来实现的。当多个线程竞争同一个时,只有一个线程能够获得,并执行 synchronized 代码块,其他线程将进入阻塞状态,直到被释放。这样就确保了共享数据的安全访问和操作的原子性,避免了多线程并发执行导致的数据不一致性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值