最近了不起在面试,经常被问到关于synchronized和Lock的相关知识点。所以整理了一些相关资料,供大家一起学习。
synchronized是Java的关键字,是基于JVM底层的Monitor锁实现的,用于修饰方法或代码块。在JDK1.6之前,synchronized的锁性能较低,但是在JDK1.6开始,JDK对synchronized锁进行了大量的优化,同时引入了无锁、偏向锁、轻量级锁、重量级锁、锁消除、锁粗化等技术来提升synchronized锁的性能。
synchronized有两种使用方法
public class SynchronizedExample {
public static void main(String[] args) {
SynchronizedExample synchronizedExample = new SynchronizedExample();
// 1.锁代码块
synchronizedExample.syncCodeBlock();
// 2.锁方法
synchronizedExample.syncMethod();
}
private void syncCodeBlock() {
synchronized (this) {
System.out.println("sync code block");
}
}
private synchronized void syncMethod() {
System.out.println("sync method");
}
}
Lock是Java并发包JUC下的接口,其有很多实现类,较为常用的是ReentrantLock,默认使用非公平锁。Lock需要进行手动加锁(lock)和解锁(unlock)。同时,Lock还有更强大的功能,如它的tryLock()方法可以非阻塞的去获取锁、使用Condition实现等待通知效果。
public class LockExample {
public static void main(String[] args) {
Lock lock = new ReentrantLock();
lock.lock();
try {
System.out.println("lock...");
}finally {
lock.unlock();
}
}
}
特征 | synchronized | Lock |
---|---|---|
锁类型 | 内置锁 | 显式锁 |
使用方式 | 关键字 | 对象实例化 |
可重入 | 是 | 是 |
可中断 | 否 | 是 |
公平性 | 不保证 | 可手动设置为公平或非公平 |
锁的数量 | 单一 | 可以创建多个 |
锁的灵活性 | 限制较多,无法扩展或自定义功能 | 提供更多灵活性,可以自定义功能 |
异常处理 | 由JVM自动处理 | 需要手动处理 |
synchronized是一种简单且易于使用的锁机制,适合简单的线程同步需求。而Lock接口提供了更多的功能和灵活性,适用于复杂的同步场景。所以,选择哪一种锁需要基于具体的需求和设计。