此问题与one of my previous ones有关。
我想要一个线程安全的设置,我可以在各种类中访问和修改,有些Runnable
,有些没有。
根据JavaDoc我正在使用
获取线程安全集 Set s = Collections.synchronizedSet(new HashSet());
但现在我想通过我的计划分享这个集合。是否可以将它放在应用程序上下文中并用XML初始化它?
答案 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。他们在更新时创建一个新的列表/集,以避免并发修改异常。
答案 3 :(得分:0)
同步集对于线程安全并不总是足够的。它只是保护单个方法调用。
如果你需要遍历集合,那么你将不得不添加额外的同步或处理ConcurrentModificationExceptions。
使用全局集有很多类会增加死锁的可能性。