Sol*_*ace 1 java concurrency multithreading
好.我在理解并发的基础知识方面遇到了一些困难.这个问题是关于死锁的.请告诉我为什么这两个线程都陷入僵局.
我从本教程中学到了这个例子.它说,
"当Deadlock运行时,两个线程在尝试调用bowBack时极有可能会阻塞.这两个块都不会结束,因为每个线程都在等待另一个线程退出."
我从中理解的是:首先,他们会等待,因为当线程调用synchronized方法时,它会自动获取synchronized方法所属对象的内部锁,并继续拥有它直到方法返回; 同时没有其他线程可以拥有它.
1.现在我的第一个问题是第一个线程调用zarah.bow(),因此内部锁与zarah相关联.第二个线程将调用khan.bow(),因此它将是一个不同的内部锁(因为它与一个名为khan的不同对象相关联),不是吗?
并不是zarah.bow()和khan.bow()不同?因为它们属于两个不同的实例?
第二个问题来自"两个"线程永远等待的概念.两个线程都将永远被阻塞,等待彼此退出.我不懂.
package Threads;
public class DeadlockModified {
static class Friend {
private final String name;
Friend(String name){
this.name=name;
}
private String getName(){
return this.name;
}
private synchronized void bow(Friend bower){
System.out.format("%s: %s"+" bowed to me.%n",bower.getName(),name);
bower.bowBack(this);
}
private synchronized void bowBack(Friend bower){
System.out.format("%s: %s" + " was nice enough to bow back to me.%n",bower.getName() ,name );
}
}
public static void main(String [] args){
final Friend zarah= new Friend("Zarah");
final Friend khan= new Friend("Khan");
new Thread(new Runnable(){
public void run(){zarah.bow(khan);}
}).start();
new Thread(new Runnable() {
public void run(){khan.bow(zarah);}
}).start();
}
}
Run Code Online (Sandbox Code Playgroud)
输出: -
Khan: Zarah bowed to me.
Zarah: Khan bowed to me.
Run Code Online (Sandbox Code Playgroud)
先感谢您.
编辑:-
在本教程的"同步方法"一节中,有人写道,
"从同步代码中调用其他对象的方法可能会产生"活动"部分中描述的问题.
这是关于活力的部分.我看到另一个对象的方法bowBack()是从bow()调用的.还有一些问题 - 看看程序的输出,看起来两个线程都没有执行bowBack().但是没有给出更多细节.
zarah.bow(khan)
:它获取引用的对象的内部锁zarah
khan.bow(zarah)
:它获取引用的对象的内部锁khan
khan.bowBack()
:它需要khan的内在锁才能做到这一点.但是这个锁由线程2保持.因此线程1等待直到线程1释放锁khan
zarah.bowBack()
:它需要zarahto的内在锁定能够做到这一点.但是这个锁由线程1保持.因此线程2等待直到线程1释放锁定zarah
因此,两个线程永远都在等待彼此.那是一个僵局.
归档时间: |
|
查看次数: |
153 次 |
最近记录: |