繁体   English   中英

我如何修改我的代码,以免死锁?

[英]How can i modify my code so it will be safe from deadlock?

我试图了解死锁是如何工作的。 我知道死锁是指2个或更多线程永远被阻塞,并且它们正在等待彼此退出阻塞状态,但它永远不会发生。 我有以下代码,我想修改它以使其免于死锁。 有人能告诉我该怎么做并向我解释理解它吗?

public class CList extends Thread {
private int item;
private Clist next;
private int updateCount=0;
public synchronized void replace(int old, int neww, Clist startedAt) {
if(item==old) {
item=neww;
updateCount++;
}
if(next!=startedAt)
next.replace(old, neww, startedAt);
}
public void run() {
 for(int i=0; i<100; i++)
 replace(i, i-1, this);
 }

public Clist(int item, Clist next) {
this.item=item;
this.next=next;
}

public static void main(String args[]) {
 Clist clist3 = new Clist(60, null);
 Clist clist2 = new Clist(40, clist3);
 Clist clist1 = new Clist(20, clist2);
 clist3.next = clist1;
 clist1.start();
 clist2.start();
 clist3.start();
}
}

这取决于预期的逻辑。

对于单个对象的一致更新,不需要为另一个对象保持锁定,因此可以通过在调用next.replace(…)时不保持锁定来防止死锁:

public void replace(int old, int neww, Clist startedAt) {
    synchronized(this) {
        if(item==old) {
            item=neww;
            updateCount++;
        }
    }
    if(next!=startedAt)
        next.replace(old, neww, startedAt);
}

在更高级别上,应用程序可能需要保持不同对象的锁定,以确保以特定方式对多个对象进行更新。 例如,在您的示例代码中,三个线程完全冗余工作,实际目的似乎是,产生死锁,因此无法消除死锁并保留原始目的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM