【发布时间】:2019-09-02 19:30:59
【问题描述】:
我有一个疑问,如果 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() 方法是否锁定某个对象。如果是,那会是哪一个?
【问题讨论】:
-
您似乎缺少的是 run() 是在另一个线程上执行的,该线程是在主线程上执行 start() 之前启动的。 start() 在 run() 执行时已经返回并释放了锁。
-
在建议的帖子中,它表明我们可以通过 Thread.holdsLock(Object) 方法检查线程是否持有某个对象的锁定,其中我们在检查之前引用了 Object。但我想让它确认 start() 方法是否锁定某个对象。如果是,那会是哪一个?
-
你不需要任何实验。 start() 方法是同步的。所以当它被执行时,它持有 Thread 对象的锁。一旦它返回,它就会释放锁。一段时间后,run() 正在执行。
-
@NitinSinghal 您似乎认为顺序是 1. start() 开始执行,2. run() 开始执行,3. run() 结束执行,4, start() 结束执行。那不是顺序。顺序是1.start()开始执行,2.starts()结束执行,3.run()开始执行,4; run() 结束其执行。因此,再次执行 run() 时,由 start() 获得的锁已被释放。
标签: java multithreading locking