java - 同步和并发集合中的空元素问题

标签 java collections concurrency synchronization

大多数同步和并发集合(例如 HashTable、ConcurrentHashMap 等)不允许空值。 null 元素有什么具体问题吗?

最佳答案

Hashtable 有点过时了,所以我不会对其发表评论。至于 ConcurrentHashMap,API 相对于标准 HashMap 的重要补充之一是一些原子方法,例如 putIfAbsent。 Javadoc:

Returns the previous value associated with the specified key, or null if there was no mapping for the key

特别是,如果映射允许空键,则该方法使用起来会复杂得多。您需要确保值不会被覆盖的典型模式是:

ConcurrentMap<K,V> map = new ConcurrentHashMap<> ();
V value = map.get(key);
if (value == null) {
    value = new V();
    V previousValue = map.putIfAbsent(key, value);
    if (previousValue != null) { //Here you need to be sure what that means
        value = previousValue;
    }
}
useValue(value);

另一个例子是如何检查键是否在 HashMap 中(并且需要返回值):

V value = map.get(key);
if (value == null && !map.containsKey(key)) {
}

并发环境中的问题是整个事情不是原子的。

另请参阅this postthese comments by the author of CHM .

关于java - 同步和并发集合中的空元素问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15731689/

相关文章:

java - RuntimeException 找不到布局 XML 资源

java - 打印数组中的字符

java - 如何在java中使用反射查找集合的大小?

java - 为什么在使用线程添加值后从 ArrayList 获取空值

带定时器的 Android(Java) 生产者/消费者

java - Spring复制属性如何工作?

java - 适用于 Java : return desirable value from method during debug 的 IntelliJ IDEA 调试器

vector - 如何将迭代器元素的类型强制转换为新类型?

java - 使用 Java MappedByteBuffer 进行并发读取

python - erlang 使用 erlport 生成 python 实例时出现 erlang 错误