关于synchronized和ReentrantLock的理解

本文详细对比了synchronized和ReentrantLock两种锁机制的实现原理与使用场景。synchronized由JVM管理,无需手动释放,适用于简单同步需求;而ReentrantLock需手动控制,更灵活,支持公平锁,适用于复杂同步场景。

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

关于synchronized和ReentrantLock的理解

作为俩个同步锁,synchronized的实现是在jvm,我们不需要手动去释放锁,jvm会替我们做好,原理大概是:jvm在执行到有synchronized关键字的方法的时候,会判断synchronized指向的对象锁里有没有锁定某一个线程,如果没有则锁定,有的话,会把该线程阻塞,并把该线程添加到等待队列,等到锁定线程执行完之后,随机选一个等待队列里的线程执行(因为有的线程很早就添加到等待队列里面了,所以随机选择对他们来说是不公平的,因此是不公平锁)。如果调用了object.wait,则该线程会释放掉锁并会被jvm添加到阻塞队列,等调用了object.notify之后jvm会将该阻塞线程重新添加到等待线程等待cpu的临幸。调用NotifyAll之后,阻塞队列里面的所有线程都获得了cpu再次执行的机会,那么是哪个线程执行呢?执行的语句会从重新获取锁开始吗?应该是这些被重新唤起的线程会再次竞争锁,竞争到的线程从wait之后的语句开始执行。

ReentrantLock的实现是在jdk,需要手动去释放锁,原理和synchronized差不多,调用ReentrantLock.lock之后,依旧会创建等待队列和阻塞队列,不同的是,可以通过condition创建不同的阻塞队列,这样,可以通过condition的await和signal来控制不同的阻塞队列,更加灵活一点。且ReentrantLock可以实现公平锁,内部维护了一个线程添加到等待序列的顺序,因此,可以按照顺序来接受cpu的临幸,因此比较公平。

目前暂时理解到这里,记录一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值