HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!

2018 年 7 月 23 日
 crossoverJie

https://crossoverjie.top/2018/07/23/java-senior/ConcurrentHashMap/

6245 次点击
所在节点    程序员
45 条回复
beny2mor
2018 年 7 月 23 日
mark 一下
crossoverJie
2018 年 7 月 23 日
@liuzhen #20 可以的。
Antidictator
2018 年 7 月 23 日
支持一下
LuckCode
2018 年 7 月 23 日
我去,从博客看到公众号,今天在 v 站看到了作者。
缘分啊,py 交易一下。
WildCat
2018 年 7 月 23 日
支持。最近用 pandoc 把你的 repo 转换成了 epub 在手机上看,受益良多
crossoverJie
2018 年 7 月 23 日
@LuckCode #24 哈哈 我这是广撒网啊 你也是哪个网都钻进来了
crossoverJie
2018 年 7 月 23 日
@WildCat #25 👍 咋搞的呀,可以提个 Issue。

https://github.com/crossoverJie/Java-Interview/issues/new
zxq1002
2018 年 7 月 23 日
打开好慢。。
WildCat
2018 年 7 月 23 日
@crossoverJie 我目前转换的有问题,不过我先开个 issue 抛砖引玉吧
crossoverJie
2018 年 7 月 23 日
@zxq1002 #28 确实挺慢的,准备转到国内了。
shidapi
2018 年 7 月 24 日
打不开。。。
crossoverJie
2018 年 7 月 24 日
@shiguiyou #31 多等等 卡。。
mrrobot97
2018 年 7 月 24 日
safari 禁用了 Flash 打开网页后风扇开始怒吼..
zpxshl
2018 年 7 月 24 日
我来提(请教)个问题。
1.8 版 concurrentHM,当使用 cas 插入,如何保证结果对其他线程可见。 volatile 不保证数组元素的可见性。
crossoverJie
2018 年 7 月 24 日
@zpxshl #34

在 put 判断当前位置为空用 CAS 写入之前调用的是:

tabAt() 方法,它所依赖的是 Unsafe 包中的 getObjectVolatile() 可以保证可见性。
zpxshl
2018 年 7 月 25 日
@crossoverJie
#35 getObjectVolatile ()只能保证自己读到的是最新值。
putObjectVolatile 才能保证将值写回主内存。
crossoverJie
2018 年 7 月 25 日
@zpxshl #36 嗯 你不是问的怎么保证可见性嘛,获取到的是最新值就不会有可见性的问题了。
zpxshl
2018 年 7 月 25 日
@crossoverJie 可见性...... 是一个变量修改其他线程都可以见到。 你获取到最新值,(为空时) cas 插入。 此时数组元素被修改,如何保证其他线程见到你的修改?
crossoverJie
2018 年 7 月 25 日
@zpxshl #38 如何保证其他线程见到你的修改?

其他线程在 tabAt()



这里不就获取了到最新值了嘛?也就是获取到了其他线程的修改。

get 的时候也是一样的:

zpxshl
2018 年 7 月 25 日
@crossoverJie 朋友。getObjectVolatile 只是获得主内存的数据。并没有强制将其他线程的工作内存数据刷新回主内存的功能。 也就是说 当你 cas 修改数组数据后,如果没有将数据缓存刷回主内存。其他线程用 getObjectVolatile 也读不到最新的值。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/473186

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX