ric*_*chs 9 java concurrency multithreading
我在初始化时完全加载了一个java HashMap,但在初始化之后,多个线程将从HashMap中读取数据.我想避免任何类型的同步,因为地图基本上是只读的,永远不会改变.但我可以保证所有线程都可以看到所有键和值吗?
如果地图的内容永远不会改变,那么您就没有问题.只有当变量的内容发生变化时,内存模型可见性问题才会发挥作用.
你可能会希望在地图的初始化既要确保没有线程访问它完全初始化之前,并确保加载到地图中的值都是可见的同步.
编辑:最初我完全忽略了地图如何初始化的问题.在阅读了一篇Pugh文章之后(再次),似乎地图确实需要是最终的,以便初始化数据变得可见:
能够看到字段的正确构造值是很好的,但如果字段本身是引用,那么您还希望代码查看它指向的对象(或数组)的最新值.如果您的字段是最终字段,则也可以保证.因此,您可以拥有一个指向数组的最终指针,而不必担心其他线程看到数组引用的正确值,但是数组内容的值不正确.同样,在这里"正确",我们的意思是"对象的构造函数结束时的最新",而不是"最新的可用值".
有一个条件列表强制"发生在之前"的关系,在Java规范中给出,我应该在这里引用它们(或者如果其他人在他们的答案中做了我会投票).静态变量和Holder成语当然是一种方法.现在的问题是相当广泛的,因为它没有指定地图如何被初始化,如果您发布说明你建议如何做初始化,你可能会得到更直接有用的答案的问题.