【问题标题】:Thread.start() method holds lock on which object?Thread.start() 方法锁定哪个对象?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我认为你错过了 OP 认为 run() 是从 start() 调用中调用的部分。
  • @SolomonSlow OP 在示例代码中使用了术语“子线程”,因此 OP 必须了解 run 是在单独的线程中调用的。似乎OP缺少的是新创建的线程可能需要获取该锁才能到达run
  • 看看 OP 如何回应 JB Nizet 的评论。 OP 显然是在错误理解下进行推理,即在线程的 run() 方法返回之前无法返回对 t.start() 的调用。我在这个网站上看到了很多问题(以及答案!),其中人们使用诸如“子线程”之类的短语,确信他们知道自己在说什么,而实际上他们并不知道。
  • @SolomonSlow 太棒了。我无法想象 OP 认为线程的目的是什么,如果您必须等待它完成,然后创建它的线程才能继续。无论如何,我认为这个答案对其他人更有用,因为 OP 的问题已经被理解并且不太可能是其他阅读/找到这个问题的人的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多