相同点
synchronized和ReentrantLock都是Java中的可重入锁;
不同点
回答思路:缺点 + 优点;
使用方法
1.synchronized 可以用来修饰普通方法、静态方法和代码块;
2.ReentrantLock 只能用于代码块,核心用法有三个方法:
lock() //加锁
unlock() //解锁
tryLock() //尝试加锁
其中lock()和unlock()这两者之间如果有 return 或者有异常,就可能导致unlock执行不到;
所以若想防止中断可以这样去写(提供了更多可能,如下图)
ReentrantLock具有解决“死等的策略”,提供了更多可能
从ReentrantLock的第三个方法中可以看出,tryLock()是试试看是否能加上锁,若成功了,就加锁成功,若失败了,就放弃,并且可以指定加锁的等待超时时间;
获取和释放锁的方式不同
从ReentrantLock的三个方法中可以看出,ReentrantLock是需要通过手动加锁和释放锁,而synchronized是自动加锁,已经执行完后释放锁;
锁类型不同
ReentrantLock既可以是公平锁,也可以是非公平的(默认非公平),若想是他成为公平锁,传一个参数即可,如下图:
synchronized是非公平锁;
唤醒机制不同
synchronized是通过 wait() / notify() 搭配来实现唤醒机制的,并且是随即唤醒一个等待线程;
ReentrantLock是搭配Condition类实现的,可以指定唤醒哪个等待的线程;
底层实现不同(不是那么重要,具体看面试情况)
synchronized是java关键字,底层是JVM实现的(通过C++实现);
ReentrantLock是标准库的一个类,底层是Java实现的;