gpt4 book ai didi

java - 这是 Java SynchronizedCollection 类中的错误吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:10:10 24 4
gpt4 key购买 nike

有一个内部类 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();

最佳答案

当然这是一个错误。两个构造函数应该是一致的,要么都抛出异常,要么都不抛出异常。

这已在 Java 8 中修复。现在两个构造函数都会抛出异常:

SynchronizedCollection(Collection<E> c) {
this.c = Objects.requireNonNull(c);
mutex = this;
}

SynchronizedCollection(Collection<E> c, Object mutex) {
this.c = Objects.requireNonNull(c);
this.mutex = Objects.requireNonNull(mutex);
}

关于java - 这是 Java SynchronizedCollection 类中的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19080095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com