gpt4 book ai didi

java - 线程从生成线程继承锁

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:13:00 27 4
gpt4 key购买 nike

当生成的线程试图获取自身的锁时,以下代码没有阻塞。

衍生线程是否继承了衍生线程的锁?

代码如下:

public class A {

public void methodA() {
public class SpawnedThread extends Thread {
public void run() {
synchronized(this) {
...
}
};

SpawnedThread spawnedThread= new SpawnedThread ();
synchronized(spawnedThread) {
spawnedThread.start();
spawnedThread.join();
};
...
}
}

最佳答案

线程不会从其他线程继承锁,这里发生了其他事情。

在您的示例中,运行 methodA 的线程必须先锁定 spawnedThread,然后才能进入同步块(synchronized block)。

然后,当 spawnedThread 运行时,它必须获取自身的锁才能进入 run 方法中的同步块(synchronized block)。

所以 methodA 线程拥有锁,而 spawnedThread 正试图获得相同的锁。但它不会死锁,因为 Thread.join 在它放弃锁的地方执行等待,参见 api documentation for Thread.join :

This implementation uses a loop of this.wait calls conditioned on this.isAlive. As a thread terminates the this.notifyAll method is invoked. It is recommended that applications not use wait, notify, or notifyAll on Thread instances.

没有超时值的 Thread.join 版本获取它正在加入的线程上的锁,放弃它,然后进入 hibernate 状态。它不会醒来,直到发生以下情况之一:

1) 加入的线程完成(发送唤醒等待线程的通知)

2) 连接线程被中断(意味着某些东西对其调用了中断,这在这个例子中没有发生)

3) 加入线程自行唤醒(“虚假唤醒”,这种情况很少见,是竞争条件的结果)

我不清楚您将如何更改锁以在此处出现死锁,如您在评论中所述,如果您想要得到答案,请将该版本的代码添加到您的问题中。

关于java - 线程从生成线程继承锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24809229/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com