1 回答
TA贡献1780条经验 获得超3个赞
来自“Java并发实践”一书:
NumberRange 可以通过使用锁定来保持其不变性来实现线程安全,例如使用公共锁保护下层和上层。它还必须避免发布 lower 和 upper 以防止客户端破坏其不变量。
这意味着以下代码是线程安全的:
@ThreadSafe
public class NumberRange {
@GuardedBy("this") private int lower, upper;
public synchronized void setLower(int i) {
if (i > upper) {
throw new IllegalArgumentException("can't set lower to " + i + " > upper");
}
lower = i;
}
public synchronized void setUpper(int i) {
if (i < lower) {
throw new IllegalArgumentException("can't set upper to " + i + " < lower");
}
upper = i;
}
public synchronized boolean isInRange(int i) {
return (i >= lower && i <= upper);
}
}
在这种情况下,NumberRange提供自己的锁定以确保复合操作是原子的。
添加回答
举报