我想在我的类中为我的Web应用程序初始化一个哈希表。
如果能以线程安全的方式执行此操作,以防万一?
public class MySettings {
private HashTable<int, SomeObject> settings;
}
是否应标记为静态或最终或易变? 我是否将其包装在同步中?
另外,如何设置SomeObject内联的属性?在java中可以吗?
答案 0 :(得分:3)
将其设为静态,最终,初始化并使用ConcurrentHashMap。
你甚至可以拥有一个单独的类,并使它变得懒惰。
像这样的东西。但是,再次使用ConcurrentHashmap。不要使用Hashtable。
import java.util。*;
class Foo {
private static final Foo foo = new Foo();
public static final Hashtable table = new Hashtable();
private Foo(){}
public static Foo Instance(){
return foo;
}
}
答案 1 :(得分:0)
我想在我的类中为我的Web应用程序初始化一个哈希表。
如果您只想为您的webapp设置一个实例,那么您的选择是:
裸static
(讨厌!!),
一个static
包含一个带有静态方法的类(讨厌,难以使用),
使用Singleton类模式包裹static
(不是那么讨厌/笨拙,但不是没有问题),或者
使用依赖注入(DI)框架创建和注入的共享实例。
从多个角度来看,最后一个是最好的,但它需要更改您的webapp以使用DI,这将是破坏性的。
所以我建议您阅读Singleton类模式以及如何在Java中实现它,以便以线程安全的方式创建和初始化:
然后就线程安全的方式提供如何使用哈希表的单独问题/问题。答案/解决方案依赖于如何您的应用程序在初始化后将使用哈希表。
如果webapp只读取哈希表,那么普通HashMap
就足够了。
如果webapp需要读取和更新哈希表,那么选择是ConcurrentHashMap
或常规HashMap
的同步包装。
如果表可能有很多想要执行操作的线程(即锁争用可能是一个问题),或者如果你需要能够在更新时迭代表条目> 正在发生,然后使用ConcurrentHashMap
。
否则,带有同步包装的HashMap
就足够了。