synchronized 与Lock的区别
- synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。
- synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁和释放锁,如果使用不当没有 unLock()去释放锁就会造成死锁,所以常在finally代码块释放。
- 通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。
synchronized 早期的实现比较低效,对比 ReentrantLock,大多数场景性能都相差较大,但是在 Java 6 中对 synchronized 进行了非常多的改进。
主要区别如下:
- ReentrantLock 使用起来比较灵活,但是必须有释放锁的配合动作。
- ReentrantLock 必须手动获取与释放锁,而 synchronized 不需要手动释放和开启锁。
- ReentrantLock 只适用于代码块锁,而 synchronized 可用于修饰方法、代码块等。