Java面试题之多线程 怎么检测一个线程是否持有对象监视器
在Java中,可以使用Thread.holdsLock(Object obj)
方法来检测当前线程是否持有指定对象的监视器(锁)。这个方法是静态的,接受一个对象作为参数,如果当前线程持有该对象的监视器,则返回true
,否则返回false
。
以下是一个简单的示例,演示如何使用Thread.holdsLock
方法:
public class MonitorExample {
private final Object lock = new Object();
public void method1() {
synchronized (lock) {
System.out.println("Thread " + Thread.currentThread().getName() + " has acquired the lock.");
// 检测当前线程是否持有锁
if (Thread.holdsLock(lock)) {
System.out.println("Thread " + Thread.currentThread().getName() + " holds the lock.");
}
// 模拟一些工作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void method2() {
// 检测当前线程是否持有锁
if (Thread.holdsLock(lock)) {
System.out.println("Thread " + Thread.currentThread().getName() + " holds the lock.");
} else {
System.out.println("Thread " + Thread.currentThread().getName() + " does not hold the lock.");
}
}
public static void main(String[] args) {
MonitorExample example = new MonitorExample();
Thread thread1 = new Thread(example::method1);
Thread thread2 = new Thread(example::method2);
thread1.start();
// 确保 thread1 先执行
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread2.start();
}
}
在这个示例中,method1
方法在synchronized
块中获取了lock
对象的监视器,而method2
方法则在没有获取锁的情况下检查当前线程是否持有该锁。运行这个程序,你会看到thread1
在执行method1
时会报告它持有锁,而thread2
在执行method2
时会报告它不持有锁。
请注意,Thread.holdsLock
方法只能在当前线程中调用,不能用于检测其他线程的锁持有状态。