我有一个疑问,如果Thread.start()方法是synchronized,那么它必须要求锁定某些对象的监视器。

如何检查并获得对该对象的引用?

public class ThreadDemo extends Thread {
    public static void main(String[] args) {
        new ThreadDemo().start();
        for (int i = 0; i < 3; i++) {
            System.out.println("Parent thread :" + currentThread());
        }
    }

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(currentThread() + " Child thread holding lock : " + currentThread().holdsLock(this));
        }
    }
}


我的输出:

Parent thread : Thread[main,5,main]
Thread[Thread-0,5,main] Child thread holding lock : false
Parent thread : Thread[main,5,main]
Thread[Thread-0,5,main] Child thread holding lock : false
Parent thread : Thread[main,5,main]
Thread[Thread-0,5,main] Child thread holding lock : false


预期:

由于我正在检查应返回true而不是false的当前对象的锁定。

如果我错过任何事情,请纠正我。

在建议的帖子中,它表明我们可以通过Thread.holdsLock(Object)方法检查线程是否在某个对象上持有锁,在检查之前我们已经引用了Object。但是我想让它确认start()方法是否在某个对象上保持锁定。如果是,那将是哪一个?

最佳答案

您的期望是不合理的。我希望锁定的目的是使新创建的线程能够查看调用start的线程所提供的所有信息,例如在什么对象上调用什么函数。到run时,新创建的线程必须访问该信息,因此应该期望到那时创建线程已经释放了锁。

10-07 19:24
查看更多