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