Lock和Synchronized的区别,源码分析
探究Lock锁(指实现Lock接口的锁,比如是ReentrantLock锁)与Synchronized的区别。
以上区别都体现在Lock接口里定义的方法,以及实现Lock接口的类(比如ReentrantLock)重写这些方法的逻辑上。
-
Lock接口里定义的抽象方法
-
ReentrantLock类实现Lock接口重写上面这些方法,重写方法里主要调用的都是AQS里方法。所以我们想要分析Lock接口的特性可以参照AQS对应方法进行分析。
-
lock():
-
lockInterruptibly():
-
tryLock():
-
因此我们可以总结出synchronized和lock的区别:
- 用法上分析:
1、synchronized锁是隐式锁,由jvm帮我们加锁释放锁;而Lock锁是显式的加锁和释放锁。所以synchronized锁更加便捷,但是因为它加锁和释放锁是固定的,因此Lock锁的会更加灵活。
- 功能上分析:
2、Lock锁支持中断,获取锁失败等待重新获取锁的线程如果被中断,会抛出异常,并且返回。而synchronized是如果线程获取锁失败会一直被阻塞,等待获取锁。
3、Lock锁支持在等待重新获取锁过程中如果超过指定时间,则直接返回。这样可以避免死锁问题。而synchronized没有这样的功能。
4、Lock锁支持公平锁,比如ReentrantLock就实现了公平锁。而synchronized只有非公平锁。
适用场景:
1、synchronized适用于简单的需要加锁的逻辑中,而Lock适用于比较复杂的代码中。
2、如果有需要中断、保证公平的情景下应该选用Lock锁。
的需要加锁的逻辑中,而Lock适用于比较复杂的代码中。
2、如果有需要中断、保证公平的情景下应该选用Lock锁。