您好我是Java多线程环境的新手。我必须在一个线程中添加,更新和删除集合中的对象集。同时我将检查并在另一个线程上迭代该对象。
列表和设置不是线程安全的。任何人都可以分享一下,哪个集合/ Map类更适合在多线程环境中使用?
答案 0 :(得分:6)
是的,
java中有ConcurrentHashMap<K,V>
,您可以使用它。
一个哈希表,支持检索的完全并发和可更新的预期并发性。
更多Collections
实用程序类具有同步方法。
Collections.synchronizedCollection(YourCollection);
和
等其他方法一样答案 1 :(得分:1)
如果您不想保存键值或“Collections.synchronizedList()”,可能是矢量。
答案 2 :(得分:1)
您可以使用从ConcurrentHashMap
创建的并发哈希集:
Set<K> set = Collections.newSetFromMap(new ConcurrentHashMap<K, Object>());
此集合是线程安全的,具有ConcurrentHashMap
的功能 - 它比Collections.synchronized*
包装器更快。
请注意,虽然集合的线程安全性并不能保证其项目的线程安全性。为了实现最少的共同可能的方法是将项目设为只读:即访问时不可变或返回副本。
答案 3 :(得分:1)
使用Collections API
public static <T> Set<T> synchronizedSet(Set<T> s)
返回由指定集
支持的同步(线程安全)集public static <T> List<T> synchronizedList(List<T> list)
返回由指定列表
支持的同步(线程安全)列表您可以将List或Set实现传递给上述方法并获得一个线程安全的
答案 4 :(得分:0)
查看java.util.concurrent包,它有几个线程安全集合
答案 5 :(得分:0)
您可以使用CopyOnWriteArrayList和CopyOnWriteArraySet 阅读它here。