java 为什么有了 synchronized 还要重复造轮子呢?
来看下 synchronized 和 Lock 的区别:
- synchronized 是非公平锁,Lock 可以实现公平锁或非公平锁
- synchronized 不可中断且无法获取锁状态,Lock 是可中断的 lockInterruptibly,同时也可获取锁的状态 isLocked
注意:synchronized 不可中断指的是阻塞队列,也就是线程竞争锁失败后进入的队列;而等待队列是可以中断的,等待队列是调用 wait 方法后进入的队列 - synchronized 是不能精准唤醒的,Lock 是可以依赖于 Condition 对象设置条件进行精准唤醒的
- Lock 手动获取和释放锁比 synchronized 更灵活,但是也带来了死锁发生的可能
- Lock 支持非阻塞的方式尝试获取锁,超时获取锁