硬编码类中的哈希表,如何以线程安全的方式执行此操作?

时间:2011-12-05 00:02:40

标签: java concurrency

我想在我的类中为我的Web应用程序初始化一个哈希表。

如果能以线程安全的方式执行此操作,以防万一?

public class MySettings {

   private HashTable<int, SomeObject> settings;

}

是否应标记为静态或最终或易变? 我是否将其包装在同步中?

另外,如何设置SomeObject内联的属性?在java中可以吗?

2 个答案:

答案 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就足够了。