加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java哈希映射线程可见性

发布时间:2020-12-14 05:50:27 所属栏目:Java 来源:网络整理
导读:我在初始化时完全加载了一个 Java HashMap,但是在初始化多个线程之后,HashMap将读取数据.我想避免任何类型的同步,因为地图基本上只读,从不改变.但是我可以保证所有的线程都可以看到所有的键和值吗? 解决方法 如果地图的内容从不改变,那么你没有问题.只有当
我在初始化时完全加载了一个 Java HashMap,但是在初始化多个线程之后,HashMap将读取数据.我想避免任何类型的同步,因为地图基本上只读,从不改变.但是我可以保证所有的线程都可以看到所有的键和值吗?

解决方法

如果地图的内容从不改变,那么你没有问题.只有当变量的内容发生变化时,内存模型可见性问题就会发挥作用.

您可能希望同步地图的初始化,以确保没有线程在完全初始化之前访问它,并确保加载到地图中的值都可见.

编辑:本来我完全忽略了地图如何初始化的问题.阅读one of the Pugh articles(再次)似乎地图真的需要是最终的,以便初始化数据变得可见:

The ability to see the correctly constructed value for the field is nice,but if the field itself is a reference,then you also want your code to see the up to date values for the object (or array) to which it points. If your field is a final field,this is also guaranteed. So,you can have a final pointer to an array and not have to worry about other threads seeing the correct values for the array reference,but incorrect values for the contents of the array. Again,by “correct” here,we mean “up to date as of the end of the object’s constructor”,not “the latest value available”.

有一个条件列出强制“先发生”的关系,在Java规范中给出,我应该在这里引用它(或者如果有人在他的答案中我会投票).静态变量和持有者成语当然是一种方式.问题是相当广泛的,因为它没有指定地图如何初始化,如果你发布一个问题描述你如何提出初始化,你可能会得到一个更直接有用的答案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读