public void function(object a, object b){
synchronized(a){
synchronized (b){
a.performAction(b);
b.performAction(a);
}
}
}
2个线程的死锁? 谢谢你的答案!
答案 0 :(得分:11)
当然,
假设我们有两个对象,
Object one = ...;
Object two = ...;
假设线程1调用:
function(one, two);
线程2调用时:
function(two, one);
在主题1 a == one
和b == two
中,但在主题2中,a == two
和b == 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();
}
}
不是最佳但可以工作。