Java synchronized
锁面试题
1. `synchronized`关键字是如何工作的?
synchronized
关键字在Java中用于实现方法和代码块的同步,确保多个线程在访问共享资源时能够保持一致性和线程安全。
2. `synchronized`和`ReentrantLock`有什么区别?
synchronized
是Java内置的同步机制,而ReentrantLock
是Java并发包中的显式锁。ReentrantLock
提供了更多的功能,如尝试非阻塞获取锁、可中断的锁获取等。
// synchronized
public synchronized void method() {
// 方法体
}
// ReentrantLock
Lock lock = new ReentrantLock();
lock.lock();
try {
// 方法体
} finally {
lock.unlock();
}
3. `synchronized`可以用于哪些地方?
synchronized
可以用于方法、代码块、类实例方法和类静态方法。
4. `synchronized`锁的获取和释放机制是什么?
当一个线程访问synchronized
方法或代码块时,它会自动获取锁,并在退出方法或代码块时释放锁。
5. `synchronized`锁是可重入的吗?
是的,synchronized
锁是可重入的,这意味着同一个线程可以多次获取同一个锁。
6. `synchronized`锁有几种锁状态?
synchronized
锁有两种状态:无锁状态和锁定状态。
7. `synchronized`锁的可见性是如何保证的?
synchronized
通过内存屏障和对变量的读写操作来保证可见性。
8. `synchronized`和`volatile`有什么区别?
synchronized
保证了操作的原子性和可见性,而volatile
只保证了可见性。
9. `synchronized`锁的公平性是什么意思?
公平性是指线程获取锁的顺序是按照它们请求锁的顺序来的。
public synchronized void method() {
// 公平锁
}
10. 如何实现一个公平的`synchronized`锁?
可以通过在方法或代码块上添加synchronized
关键字,并确保所有线程都通过相同的锁对象获取锁。
11. `synchronized`锁和`Lock`接口有什么区别?
synchronized
是Java内置的同步机制,而Lock
接口提供了更灵活的锁定机制。
12. `synchronized`锁可以中断吗?
不可以,synchronized
锁不能响应中断,而Lock
接口的lockInterruptibly
方法可以响应中断。
13. `synchronized`锁可以超时吗?
不可以,synchronized
锁没有超时机制,而Lock
接口的tryLock
方法有超时机制。
14. `synchronized`锁和`ReentrantLock`的性能比较?
在某些情况下,ReentrantLock
的性能可能优于synchronized
,特别是在需要超时、中断或尝试非阻塞获取锁的场景下。
15. `synchronized`锁可以绑定多个条件吗?
不可以,synchronized
锁只能绑定一个条件,而ReentrantLock
可以绑定多个条件。
16. `synchronized`锁在类实例方法和静态方法中的行为有什么区别?
在类实例方法中,synchronized
锁定的是当前实例对象;在静态方法中,锁定的是当前类的Class
对象。
17. `synchronized`锁可以跨多个方法使用吗?
可以,只要这些方法使用相同的锁对象,就可以跨多个方法使用。
18. `synchronized`锁在异常发生时会释放吗?
是的,即使在发生异常时,synchronized
锁也会被释放。
19. `synchronized`锁可以用于类的静态代码块吗?
不可以,synchronized
不能用于代码块,只能用于方法或同步代码块。
20. `synchronized`锁可以用于类的静态变量吗?
可以,synchronized
可以用于保护对静态变量的访问。
21. `synchronized`锁可以用于类的静态初始化块吗?
不可以,synchronized
不能用于静态初始化块。
22. `synchronized`锁可以用于类的私有方法吗?
可以,synchronized
可以用于类的私有方法,以确保线程安全。
23. `synchronized`锁可以用于类的构造方法吗?
可以,synchronized
可以用于类的构造方法,以确保线程安全。
24. `synchronized`锁可以用于类的析构方法吗?
Java没有析构方法,但synchronized
可以用于任何需要同步的方法。
25. `synchronized`锁可以用于类的`main`方法吗?
可以,synchronized
可以用于main
方法,以确保线程安全。