在java.util.Collections中有一个内部类SynchronizedCollection
有两个构造函数.第一个采用集合,另一个采用集合和互斥.
前构造函数检查参数是否为空.但后来不要!
这是实施.
SynchronizedCollection(Collection c) {
if (c==null)
throw new NullPointerException();
this.c = c;
mutex = this;
}
SynchronizedCollection(Collection c, Object mutex) {
this.c = c;
this.mutex = mutex;
}
通过这个实现,我可以通过向第二个发送null来打破类不变量
构造函数.
我相信它应该是这样的:
SynchronizedCollection(Collection c) {
this(c,this)
}
SynchronizedCollection(Collection c, Object mutex) {
if (c==null)
throw new NullPointerException();
this.c = c;
this.mutex = mutex;
}
但是我不能说服自己Josh Bloch和Neal Gafter看不到这一点.所以你真的可以告诉我在这里错过了什么吗?
编辑:可能的攻击
Map m = new Map(){
@Override
public int size() {
// TODO Auto-generated method stub
return 0;
}
.
.
.
@Override
public Collection values() {
return null;
}
};
Map synchronizedMap = Collections.synchronizedMap(m);
Collection values = synchronizedMap.values();