- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当生成的线程试图获取自身的锁时,以下代码没有阻塞。
衍生线程是否继承了衍生线程的锁?
代码如下:
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/
我是一名优秀的程序员,十分优秀!