Java多线程与并发原理 --- synchronized 与 ReentrantLock 的区别

本文主要探讨了synchronized与ReentrantLock的区别。ReentrantLock位于java.util.concurrent.locks包,基于AQS实现,能实现更细粒度控制,可设置公平性,还能将锁对象化。而synchronized是非公平锁。相比之下,ReentrantLock提供了更多灵活方案,可避免死锁、获取锁信息及实现多路通知。

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

synchronized 与 ReentrantLock 的区别?

ReentrantLock (再入锁)

1、位于 java.util.concurrent.locks 包

2、和CountDownLatch 、FuntureTask、Semaphore 一样基于AQS 实现。

3、能够实现比Synchronized 更细粒度的控制,如控制fairness。

4、调用lock()之后,必须调用unlock()释放锁。

5、性能未必比synchronized 高。并且也是可重入的。

ReentrantLock 公平性设置

1、ReentrantLock lock = new ReentrantLock(true);

2、当true 倾向于将锁赋予等待时间最久的线程。

3、公平锁:获取锁的顺序安装先后调用lock方法的顺序(慎用);

4、非公平锁:抢占的顺序不一定,看运气。

5、synchronized 是非公平锁。

ReentrantLock 将锁对象化

1、判断是否有线程,或者将某个特定线程,在排队获取锁。

2、带超时的获取锁的尝试。

3、感知有没有成功获取锁。

是否能将 wait / notify / notifyAll 对象化?

1、java.util.concurrent.locks.Condition

总结:

1、synchronized 是关键字 ,ReentrantLock 是类。

2、因为 ReentrantLock 是类所以提供了比 synchronized 更多更灵活的方案。可以被继承,可以有方法。可以有各种各样的类变量。

3、ReentrantLock 可以对获取锁的等待时间设置,避免死锁。

4、ReentrantLock 可以获取各种锁的信息。

5、ReentrantLock 可以灵活的实现多路通知。

6、二者的锁机制也是不一样的。sync 操作 Mark word ,lock 调用 Unsafe 类的 park () 方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值