我目前正在阅读The Good-Grounded Java开发人员书籍中有关并发的部分,这个演示块并发性的代码示例应该会死锁,但据我所知,它并不会。下面的代码:这个例子中的死锁在哪里?
public class MicroBlogNode implements SimpleMicroBlogNode {
private final String ident;
public MicroBlogNode(String ident_){
ident = ident_;
}
public String getIdent(){
return ident;
}
public static Update getUpdate(String _name){
return new Update(_name);
}
public synchronized void propagateUpdate(Update upd_, MicroBlogNode backup_){
System.out.println(ident + ": received: " + upd_.getUpdateText() + " ; backup: " + backup_.getIdent());
backup_.confirmUpdate(this, upd_);
}
public synchronized void confirmUpdate(MicroBlogNode other_, Update update_){
System.out.println(ident + ": received confirm: " + update_.getUpdateText() + " from " + other_.getIdent() + "\n");
}
public static void main(String[] args) {
final MicroBlogNode local = new MicroBlogNode("localhost");
final MicroBlogNode other = new MicroBlogNode("remotehost");
final Update first = getUpdate("1");
final Update second = getUpdate("2");
new Thread(new Runnable() {
public void run() {
local.propagateUpdate(first, other);
}
}).start();
new Thread(new Runnable() {
public void run() {
other.propagateUpdate(second, local);
}
}).start();
}
}
当我运行它,我得到以下输出:
localhost: received: 1 ; backup: remotehost
remotehost: received confirm: 1 from localhost
remotehost: received: 2 ; backup: localhost
localhost: received confirm: 2 from remotehost
书中说,如果你运行的代码,通常你将会看到一个死锁两个示例线程将报告接收更新,但都不会确认接收到它们是备份线程的更新 。原因是每个线程都要求另一个线程在确认方法可以进行之前释放它所持有的锁。
据我所见,情况并非如此 - 每个线程都确认接收到它们是备份线程的更新。
在此先感谢。
你确定这是书中的例子吗?向我们展示'Update'类。 –
getUpdateText方法在哪里? – wheaties