我有一个CircleImpl类,它实现了一个只能存在于XY正面的圆(半径> = 0,x> =半径,y> =半径。)
我在CircleImpl中有一个函数:
//this function changes the current circle (this) to make it contain the circle other.
public synchronized void union(Circle other) throws Exception {
if (!checkInv(other.getX(),other.getY(),other.getRadius()))
throw new Exception("Illegal circle: " + other);
synchronized (other) {
setRadius(calculateUnionRadius(_x,_y,_radius,other.getX(),other.getY(),other.getRadius()));
}
}
现在可能存在死锁的问题:
Circle c1,c2;
…
T1: c1.union(c2);
T2: c2.union(c1);
c1锁定自身(this)并在锁定“其他”之前(c2)c2获取CPU时间并自行锁定(c2)并尝试锁定“其他”(c1)并进入阻止模式。
什么可能的SIMPLE解决方案不包括资源排序(System.identityHashCode)?
答案 0 :(得分:2)
简单(但不是真正有效)的解决方案是在共享对象上同步union
操作,例如在Circle.class
。缺点是它允许在任何给定时间仅为1个线程执行union
。类似的东西:
public void union(Circle other) throws Exception {
synchronized (Circle.class) {
if (!checkInv(other.getX(),other.getY(),other.getRadius())) {
throw new Exception("Illegal circle: " + other);
}
setRadius(calculateUnionRadius(_x,_y,_radius,other.getX(),other.getY(),other.getRadius()));
}
}