synchronized和Lock在Java多线程中都是用于控制多个线程对共享资源的访问,但它们之间存在多个显著的区别:
1. 本质和类型
- synchronized:是Java中的一个关键字,属于Java语言层面的一部分,由JVM(Java虚拟机)直接支持。
- Lock:是Java中的一个接口,位于java.util.concurrent.locks包下,属于JDK层面实现的接口,提供了比synchronized更灵活的锁操作。
2. 加锁方式
- synchronized:是隐式的加锁,即当线程进入synchronized修饰的方法或代码块时,会自动获取锁,并在方法或代码块执行完毕后自动释放锁。
- Lock:是显式的加锁,需要手动调用lock()方法来获取锁,并在finally块中调用unlock()方法来释放锁,以确保锁的正确释放。
3. 锁的灵活性
- synchronized:提供的锁是单一的,无论是可重入锁还是不可中断锁,其特性都是固定的。
- Lock:提供了比synchronized更灵活的锁操作,如可中断锁、可尝试非阻塞地获取锁、超时获取锁等。此外,Lock还支持公平锁和非公平锁。
4. 锁的粒度
- synchronized:可以作用于方法上或代码块上,但作用于方法时,锁定的是整个方法,粒度较粗。
- Lock:只能作用于代码块上,可以更加精细地控制锁的粒度,提高程序的并发性能。
5. 底层实现
- synchronized:在JVM层面上实现,依赖于对象监视器(Object Monitor)机制。
- Lock:在JDK层面上实现,通常依赖于AbstractQueuedSynchronizer(AQS)框架。
6. 等待/通知机制
- synchronized:使用Object类的wait()、notify()和notifyAll()方法进行线程间的通信。
- Lock:提供了Condition接口,通过Condition的await()、signal()和signalAll()方法进行线程间的通信,这些方法与Object的wait/notify机制相比,提供了更灵活的线程通信控制。
7. 锁的公平性
- synchronized:只支持非公平锁,即锁的分配是随机的,不保证等待时间最长的线程优先获取锁。
- Lock:支持公平锁和非公平锁,通过创建ReentrantLock时传入true或false参数来指定。
1992

被折叠的 条评论
为什么被折叠?



