Java多线程中检测线程持有对象监视器的方法

Java Q&A Hub 使用 GPT-4o-mini 回答

问题:

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方法只能在当前线程中调用,不能用于检测其他线程的锁持有状态。