前几天回去复习了一下juc的知识,今天来总结下Synchronized锁和Lock锁的区别
主要区别:
1、语法和使用方式
Synchronized是 Java 的关键字,由JVM底层实现,自动加锁/释放锁。用起来简单,作用在方法上即可。
// Synchronized
public synchronized void syncMethod() {
// 自动加锁/释放
}
Lock是java.util.concurrent.Locks 包下的一个接口,需要显式获取和释放锁。
Lock lock = new ReentrantLock();
lock.lock();
try {
// 临界区
} finally {
lock.unlock(); // 必须手动释放
}
2、对于锁的释放
Synchronized 使用过后,会自动释放锁,而Lock需要手动上锁、手动释放锁(在 finally 块中)。
3、公平锁/非公平锁
synchronized关键字是非公平锁,即不能保证等待锁的那些线程们的顺序,不支持公平锁;
而Lock的子类ReentrantLock默认是非公平锁,但是可通过一个布尔参数的构造方法实例化出一个公平锁;
4、能否尝试获取锁
Synchronized无法尝试,只能等待;而Lock通过tryLock()方法,可以尝试在一定时间内获取锁。
5、可中断性
synchronized 关键字不能响应中断,而Lock提供了更多的实现方法,而且 可响应中断、可定时,例如lock.lockInterruptibly()可以响应中断。
6、可组合性与可扩展性
Lock 可以组合成更复杂的同步结构,例如:限时锁、可轮询获取锁和可实现多个条件队列等;
synchronized 结构固定,不具备这些灵活特性。
8、性能
早期版本中,Synchronized性能较差(重量级锁),但JDK 1.6后优化(偏向锁、轻量级锁),与Lock性能接近;高并发竞争场景下,Lock的灵活性与性能可能更优。
9、使用场景
Synchronized:简单同步需求(如单方法/代码块同步),代码简洁;
Lock:复杂场景(如需要可中断、超时、公平锁、多条件变量)。
要是感觉有用就点个赞吧,谢谢大家!!!