我有一个 CircleImpl 类,它实现了一个只能存在于 XY 正侧的圆(radius>=0,x>=radius 和 y>=radius。)
我在 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),在锁定“other”(c2)之前,c2 获得 CPU 时间并锁定自己(c2)并尝试锁定“other”(c1)并进入阻塞模式。
什么可能的简单解决方案不包括资源排序(System.identityHashCode)?