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

Ric*_*d H 4 java readonly thread-safety

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

Dar*_*usz 6

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

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

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