线程安全 - 读取可变对象(java)

时间:2014-02-17 09:59:05

标签: java thread-safety readonly

我有一个共享资源 - 一个包装HashMap的简单POJO - 将在启动时初始化一次,然后只能由许多线程(可能是同时)读取(上下文是Web应用程序)。我是否需要同步对象的访问(或者使用并发hashap)或者是否可以安全地同时进行多次读取?同步会增加显着的开销吗?

3 个答案:

答案 0 :(得分:6)

如果确保所有写入所有读取之前发生,则可以跳过同步以获取对该映射的读取权限。它的含义在JLS 7 chapter 17.4.5中有描述。

在实践中,您必须确保在启动任何其他将访问它的线程之前填充HashMap,并且之后不会修改其内容。

此解决方案起作用的原因是Thread.start()调用强制执行同步,因此保证在该调用之后所做的所有更改在该调用之后对新旧线程都可见。如果您在该调用后修改该对象,则此保证将丢失,并且必须进行同步访问。

答案 1 :(得分:2)

如果您确定所需要的只是执行读取操作,则不需要同步。这也是存在不同锁定的原因 - 在ReadWriteLock中读取和写入。

  

ReadWriteLock维护一对关联的锁,一个用于只读操作,另一个用于写入。只要没有写入器,读锁定可以由多个读取器线程同时保持。写锁是独占的。

由于没有作家,因此无需同步。

答案 2 :(得分:1)

由于多次读取的结果不依赖于事件的顺序,我会说你没有遇到竞争条件(http://en.wikipedia.org/wiki/Race_condition),因此没有必要同步访问。