55 synchronized 和 ReentrantLock 区别是什么?

synchronized 和 ReentrantLock 区别是什么?

答:

synchronized 早期的实现比较低效,对比 ReentrantLock,大多数场景性能都相差较大,但是在 Java 6 中对 synchronized 进行了非常多的改进。

主要区别如下:

ReentrantLock 使用起来比较灵活,但是必须有释放锁的配合动作;

ReentrantLock 只适用于代码块锁,而 synchronized 可用于修饰方法、代码块等。

synchronized 竞争锁时会一直等待;ReentrantLock 可以尝试获取锁,并得到获取结果

synchronized 获取锁无法设置超时;ReentrantLock 可以设置获取锁的超时时间

synchronized 无法实现公平锁;ReentrantLock 可以满足公平锁,即先等待先获取到锁

synchronized 控制等待和唤醒需要结合加锁对象的 wait() 和 notify()、notifyAll();ReentrantLock 控制等待和唤醒需要结合 Condition 的 await() 和 signal()、signalAll() 方法

synchronized 是 JVM 层面实现的;ReentrantLock 是 JDK 代码层面实现

synchronized 在加锁代码块执行完或者出现异常,自动释放锁;ReentrantLock 不会自动释放锁,需要手动在 finally{} 代码块显示释放

原文链接: https://www.cnblogs.com/ConstXiong/p/12014904.html

补充一个相同点:都可以做到同一线程,同一把锁,可重入代码块。

猜你喜欢

转载自www.cnblogs.com/ynzj123/p/12897620.html