在多个类上共享线程安全设置

时间:2011-04-07 07:32:42

标签: java multithreading collections thread-safety

此问题与one of my previous ones有关。

我想要一个线程安全的设置,我可以在各种类中访问和修改,有些Runnable,有些没有。

根据JavaDoc我正在使用

获取线程安全集
  Set s = Collections.synchronizedSet(new HashSet());

但现在我想通过我的计划分享这个集合。是否可以将它放在应用程序上下文中并用XML初始化它?

4 个答案:

答案 0 :(得分:1)

如果您认为它足以传递到Runnable中,那么我认为没有理由不适合您的应用程序环境。

我应该注意,作为一般规则,全局变量打开了很难追踪错误的大门,你应该强烈考虑在运行时修改单个应用程序范围的上下文。 (如果它只读过,从未写过,你根本就没有问题,我会考虑改用Collections.unmodifiableSet(generatedHashset);

答案 1 :(得分:1)

如果需要从多个线程访问和修改集合,则需要一个线程安全集。

在大多数情况下,ConcurrentHashMap是我的首选。从Java 6开始,使用Collections.newSetFromMap()创建地图集是一种同步。

Set<Type> concurrentSet = Collections.newSetFromMap(new ConcurrentHashMap<Type,Boolean>());

答案 2 :(得分:0)

由于glowcoder提到将此设置放到应用程序上,因此会引发数据一致性问题。如果来自多个线程的任何更新访问applicationContext以修改set,则使用CopyOnWriteArrayList或CopyOnWriteArraySet。他们在更新时创建一个新的列表/集,以避免并发修改异常。

CopyOnWriteArraySet

答案 3 :(得分:0)

同步集对于线程安全并不总是足够的。它只是保护单个方法调用。

如果你需要遍历集合,那么你将不得不添加额外的同步或处理ConcurrentModificationExceptions。

使用全局集有很多类会增加死锁的可能性。