139

问答题 139 /413

ReentranceLock 和 synchronized 有什么区别

参考答案

参考回答:

1.可重入性

字面的意思就是可以再次进入的锁,synchronized其实也是可重锁,同一线程每进入一次,锁的计数器都会加一,在释放锁是计数器都会减一,只有当计数器为0 时才能释放锁

2.锁的实现

ReentrantLock是JDK实现的 Synchronized 是JVM实现
前者可以直接看到源码,后者实现难以看到

3.性能的区别

在Synchronized优化以前,synchronized的性能是比ReenTrantLock差很多的,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了,在两种方法都可用的情况下,官方甚至建议使用synchronized,其实synchronized的优化我感觉就借鉴了ReenTrantLock中的CAS技术。都是试图在用户态就把加锁问题解决,避免进入内核态的线程阻塞。

4.功能的区别

便利性:很明显Synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放,而ReenTrantLock需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好在finally中声明释放锁。
锁的细粒度和灵活度:很明显ReenTrantLock优于Synchronized

当你需要时候一下三种功能是需要使用ReentrantLock

ReentranLock 可以指定公平锁还是非公平锁
(公共锁就是先等待的线程先获得锁)
实现自旋锁,通过循环调用CAS操作来实现加锁,性能比较好,避免进入内核态的线程阻塞。

提供了Condition类,可以分组唤醒需要唤醒的线程

提供能够中断等待锁的线程的机制,lock.lockInterruptibly()

具体使用场景要根据实际的业务进行分析
使用Synchronized时不需要释放锁,jvm会帮助我们做释放锁的操作