【发布时间】:2014-02-25 10:20:29
【问题描述】:
java.util.concurrent 提供了许多线程安全的集合,例如ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet 和ConcurrentLinkedQueue。这些集合应该通过允许并发访问数据结构的不同部分来最小化争用。
Java 还具有同步包装器,以允许并发访问非线程安全集合,例如 HashMap 和 Arraylist。
Map<KeyType, ValType> m = Collections.synchronizedMap(new HashMap<KeyType, ValType>());
在处理这些线程安全集合时,我们还需要执行客户端锁定吗?特别是在对它们进行迭代时?
Set<KeyType> s = m.keySet();
synchronized(m) {
for (KeyType k : s)
foo(k);
}
在这种情况下,是否只为某些类型的操作提供线程安全?
有没有一种方法可以在不使用同步的情况下提供线程安全的集合?我熟悉 volatile 关键字,它可能与非原子操作的原始值一起使用。
【问题讨论】:
-
您是否阅读了
synchronizedMap的文档?它至少回答了您的一个问题... -
并发集合不使用同步关键字并且是线程安全的。
标签: java collections synchronization