- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有一个内部类 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/
为什么 Sun 不使用 synchronized(this) 而不是 mutex = this 然后使用 synchronized(mutex) ? 我看不出他们所做的有什么好处吗?我错过了什么吗?
如何SynchronizedCollection和 System.Collections.Concurrent 中的并发集合命名空间彼此不同,除了 Concurrent Collections 是一个
有一个内部类 SynchronizedCollection - 在 java.util.Collections 里面有两个构造函数。第一个获取集合,另一个获取集合和互斥锁。前构造函数检查参数是否为空。
我在 Java 中使用 Collections.synchronizedCollection 来保护一个集合,我知道这个集合正在被许多线程同时访问。 Java API 警告: "用户在遍历返回的集合时
我指的是问题 here并使用作者代码示例,现在我的问题是 为什么作者使用synchronized(synchronizedMap),真的有必要吗,因为synchronizedMap总是确保没有两个线程
我试图在我的 C# 代码中包含以下行,但由于某种原因它被标记为错误: public SynchronizedCollection allImages = new Synchronize
SynchronizedCollection.Remove() 的 MSDN 文档( https://msdn.microsoft.com/en-us/library/ms619895(v=vs.11
我想知道是否有人知道为什么 SynchronizedCollection 类是在 ServiceModel 程序集中实现的。我看不到程序集名称和这个(相对)通用类之间的任何联系。 最佳答案 这个类非常
作为我上一篇文章的后续 Is iteration via Collections.synchronizedSet(...).forEach() guaranteed to be thread safe
我们可以对所有 Collections 类型的对象(如 Set 和 List)使用 Collections.synchronizedCollection(Collection c),这就是为什么我们有
.NET 4.0 引入了 System.Collections.Concurrent命名空间: "The System.Collections.Concurrent namespace provide
我是一名优秀的程序员,十分优秀!