0

我有一个类,它读取一个 xml 文件并将它们填充到一个私有静态数据结构(比如 HashMap)中。这个初始填充发生在一个静态块中。然后我有方法来获取给定键的值,实习生指的是静态 HashMap。考虑一下这种情况,当多个线程尝试获取给定键的值时,是否会影响性能?例如,当一个线程正在读取该静态对象时,其他线程必须等待。

  public class Parser
  {
       private static HashMap resource = new HashMap();

       static
       {
         parseResource();
       }

       private Parser()
       {
       }

       private static parseResource()
       {
           //parses the resource and populates the resource object
       }

       public static Object getValue( String key)
       {
           //may be some check will be done here, but not any     
           //update/modification actions
          return resource.get(key);
       }    
   }
4

4 回答 4

1

首先,值得注意的是,这实际上与static. 没有“静态对象”之类的东西——只有对象,还有一些字段和方法可能是静态的,也可能不是静态的。例如,可能有一个实例字段和一个静态字段都引用同一个对象。

在线程安全方面,您需要考虑对单个对象感兴趣的操作的安全性——多个线程如何“到达”该对象并不重要。

例如,当一个线程正在读取该静态对象时,其他线程必须等待。

不,它没有。

如果您只是在构建它之后读取HashMap它,以防止它在完成之前对其他线程可见,那很好。(重新阅读您的评论后,看起来情况就是这样getValue。)

如果您需要在其他线程读取映射时对映射执行任何更改,请考虑使用ConcurrentHashMap或使用同步。

文档中HashMap

请注意,此实现不同步。如果多个线程同时访问一个哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。

于 2013-09-19T12:09:31.997 回答
0

您的示例代码中没有发生锁定,因此多个线程不可能需要等待。

于 2013-09-19T12:08:50.977 回答
0

只需添加 Jon Skeet 的答案,对于这种用途,您可能需要考虑 Guava 的ImmutableMap,它强制执行不变性。

于 2013-09-19T12:18:09.073 回答
-1

只需使用synchronized关键字,一切都应该正常。

于 2013-09-19T12:09:22.950 回答