public class MutablePointMI { private MutableInteger x, y; public MutablePointMI(int x, int y) { this.x = new MutableInteger(x); this.y = new MutableInteger(y); } void setX(int v) { x.set(v); } void setY(int v) { y.set(v); } int getX() { return x.get(); } int getY() { return y.get(); } // This method is complicated because we have to make sure that // the X and Y values we compare are consistent---that a mutation // does not occur after retrieving one integer but before // retrieving the other public boolean equals(Object o) { if (o instanceof MutablePointMI) { MutablePointMI p = (MutablePointMI)o; int px, py; synchronized (p) { px = p.getX(); py = p.getY(); } synchronized (this) { return (px == getX() && py == getY()); } } return false; } }