1

我有一个 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)?

4

1 回答 1

2

简单(但不是真正有效)的解决方案是在共享对象上同步union操作,例如在Circle.class. 缺点是它只允许union在任何给定时间执行 1 个线程。就像是:

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())); 
    } 
} 
于 2013-02-03T18:37:12.537 回答