这种方法有可能陷入僵局吗?我该怎样预防呢?

时间:2015-05-25 19:54:17

标签: java deadlock

public void function(object a, object b){
    synchronized(a){
        synchronized (b){
           a.performAction(b);
           b.performAction(a);
        }
    }
}

2个线程的死锁? 谢谢你的答案!

2 个答案:

答案 0 :(得分:11)

当然,

假设我们有两个对象,

Object one = ...;
Object two = ...;

假设线程1调用:

function(one, two);

线程2调用时:

function(two, one);

在主题1 a == oneb == two中,但在主题2中,a == twob == one

因此,当线程1在对象1上获得锁定时,线程2可以获得对象2上的锁定。然后,当每个线程尝试进行下一步时,它们将陷入僵局。

答案 1 :(得分:2)

为了避免jame的答案所述的问题,您需要创建一个锁来保存这两个对象,无论它们传递给函数的顺序如何:

var items = "<div class=\"item\"><div class=\"item-img\" style=\"background-image: url('images.123.jpg')\"></div></div>"

在你的功能中,你需要以某种方式存储锁:

public class TwoObjectsLock {
    private Object a;
    private Object b;

    public TwoObjectsLock(Object a, Object b){
        this.a = a;
        this.b = b;
    }

    @Override
    public void equals(Object obj){
        if (this == obj) return true;
        if (obj instanceof TwoObjectsLock){
            TwoObjectsLock that = (TwoObjectsLock) obj;
            return (this.a.equals(that.a) && this.b.equals(that.b)) ||
                   (this.a.equals(that.b) && this.b.equals(that.a));
        }
        return false;
    }

    @Override
    public int hashCode(){
        return a.hashCode() + b.hashCode();
    }
}

不是最佳但可以工作。