我有一个疑问,如果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
时,新创建的线程必须访问该信息,因此应该期望到那时创建线程已经释放了锁。