Java start()方法锁定了哪个对象?

Java start()方法锁定了哪个对象?,java,multithreading,locking,Java,Multithreading,Locking,我有一个疑问,如果Thread.start()方法是synchronized,那么它一定需要锁定某个对象的监视器 如何检查此项并获取对该对象的引用 public class ThreadDemo extends Thread { public static void main(String[] args) { new ThreadDemo().start(); for (int i = 0; i < 3; i++) { Sys

我有一个疑问,如果
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));
        }
    }
}
预期:

因为我正在检查当前对象的锁,该对象应该返回
true
,而不是
false

如果我遗漏了什么,请纠正我


在建议的帖子中,它显示了我们可以通过方法thread.holdsLock(object)检查线程是否在某个对象上持有锁,其中我们在检查之前有对象的引用。但我想确认start()方法是否对某个对象持有锁。如果是,那么是哪一个呢?

你的期望是不合理的。我希望锁的目的是让新创建的线程能够看到调用
start
的线程提供的所有信息,比如调用什么对象的函数。当您到达运行时,新创建的线程必须访问该信息,因此创建线程应该在该点之前释放锁。

可能缺少的重复是,run()在另一个线程上执行,该线程在start()之前启动过在主线程上执行。start()已经返回并在执行run()时释放了锁。在建议的帖子中,它显示我们可以通过方法thread.holdsLock(object)检查线程是否在某个对象上持有锁,其中我们在检查之前引用了对象。但我想确认start()方法是否对某个对象持有锁。如果是的话,那么是哪一个呢?你不需要做任何实验。start()方法已同步。因此,当它被执行时,它持有线程对象上的锁。一旦它返回,就会释放锁。过了一段时间,run()正在执行。@NitinSinghal您似乎认为序列是1。start()开始执行,2。run()开始执行,3。run()结束执行,4,start()结束执行。这不是顺序。顺序是1。start()开始执行,2。start()结束其执行,3。run()开始执行,4;run()结束其执行。因此,在执行run()时,start()获得的锁再次被释放。我认为您缺少OP认为
run()
是从
start()
调用中调用的部分。@SolomonSlow OP在示例代码中使用了术语“子线程”,因此OP必须理解
run
是在单独的线程中调用的。OP似乎缺少的是,新创建的线程可能需要获得该锁才能运行
。OP显然是在错误理解的情况下推理的,即在线程的
run()
方法返回之前,无法返回对
t.start()
的调用。我在这个网站上看到了不止几个问题(还有答案!),在这些问题中,人们使用诸如“儿童线索”之类的短语,自信地认为自己知道自己在说什么,而实际上他们却毫无头绪。@SolomonSlow这太神奇了。如果在创建线程的线程可以继续之前必须等待线程完成,我无法想象OP认为线程的目的是什么。无论如何,我认为这个答案对其他人更有用,因为OP的问题已经被理解,不太可能是阅读/发现这个问题的其他人的问题。
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