V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  crossoverJie  ›  全部回复第 12 页 / 共 32 页
回复总数  636
1 ... 8  9  10  11  12  13  14  15  16  17 ... 32  
2018-07-27 00:59:37 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@zpxshl #42

如果 A 线程写入成功之后 B 线程就算是恰巧在 A 线程还未写入之前判断到是空进入了 CAS 的逻辑。

由于最终调用的还是 casTabAt()

https://ws2.sinaimg.cn/large/006tKfTcgy1ftnr3mdivaj30fp01sjrj.jpg

底层调用的是 unsafe.compareAndSwapObject 方法,他的期望是当前值为 null ,才会写入一个新的 Node。

由于该方法是线程安全的,此时当前值已经不为 null 了,所以必定会写入失败。

还有一个是,虽然是用 volatile 修饰的数组,但是用的是 getObjectVolatile 和 putObjectVolatile,依然可以保证可见性。

见:

https://stackoverflow.com/questions/31534706/about-unsafe-getobjectvolatile-usage
2018-07-25 13:09:23 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@zpxshl #40 兄弟,我觉得这没有啥问题呀。

https://ws1.sinaimg.cn/large/006tKfTcly1ftm0tehm4vj316w0ra44o.jpg

用 CAS 的前提是,遍历数组的时候在 key 所映射的那个位置是空的,也就是没有其他线程使用的时候才会在 2 处利用 CAS 尝试写入一个 Node。

也就是说写入成功的话是不会有线程竞争的,这样也就不会存在你说的可见性问题(如果这时有线程来做 get ,恰好也定位到这个位置,那在写入线程更新成功之前获取的肯定也是空)。

如果写入失败,CAS 返回 false,这样就会重新从 1 处再次循环。

这样如果当前位置有数据了那就会用 synchronized 来写,用 synchronized 的话也不会出现可见性问题。

如果当前位置依然为空的话就会重复上面的步骤。
2018-07-25 10:28:51 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@zpxshl #38 如何保证其他线程见到你的修改?

其他线程在 tabAt()

https://ws1.sinaimg.cn/large/006tNc79ly1ftlw9yuc6vj31ac0jytdg.jpg

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

get 的时候也是一样的:

https://ws3.sinaimg.cn/large/006tNc79ly1ftlwdb31v2j31620k2djy.jpg
2018-07-25 09:05:00 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@zpxshl #36 嗯 你不是问的怎么保证可见性嘛,获取到的是最新值就不会有可见性的问题了。
2018-07-24 13:11:58 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@zpxshl #34

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

tabAt() 方法,它所依赖的是 Unsafe 包中的 getObjectVolatile() 可以保证可见性。
2018-07-24 10:19:56 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@shiguiyou #31 多等等 卡。。
2018-07-23 20:06:55 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@zxq1002 #28 确实挺慢的,准备转到国内了。
2018-07-23 18:43:32 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@WildCat #25 👍 咋搞的呀,可以提个 Issue。

https://github.com/crossoverJie/Java-Interview/issues/new
2018-07-23 18:42:07 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@LuckCode #24 哈哈 我这是广撒网啊 你也是哪个网都钻进来了 https://ws1.sinaimg.cn/large/b64a58e3gy1fikr7bnfrmj200k00k0sh.jpg
2018-07-23 17:52:12 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@liuzhen #20 可以的。
2018-07-23 16:29:37 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@llxx510200 #18 这个我觉得能讲清楚为啥快,啥时候翻转这些就差不多了。具体实现确实很复杂
2018-07-23 15:01:58 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@orm #14 看来迁回国内得提上议程了。
2018-07-23 14:52:03 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@alamaya #15 嗯 扩容那块很复杂,得单独拿一篇讲才行。
2018-07-23 11:03:46 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
2018-07-23 10:10:36 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@amon #9 哈哈 V 站的人都超有趣的 很喜欢这里。
2018-07-23 09:45:20 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@guoyuchuan #4 没办法 用的 cloudflare 的 DNS 很慢,迁移到国内又要备案 https://ws3.sinaimg.cn/bmiddle/62e721e4gw1et02cnd1vqj200k00k3y9.jpg
2018-07-23 09:43:48 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@nVoxel #5 主题没换 就是换了一个配置 不想折腾博客了 但总得有点新鲜感 https://ws3.sinaimg.cn/bmiddle/62e721e4gw1et02ek7u61j200k00k3y9.jpg
2018-07-23 08:47:50 +08:00
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
1 ... 8  9  10  11  12  13  14  15  16  17 ... 32  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1041 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 19ms · UTC 19:33 · PVG 03:33 · LAX 11:33 · JFK 14:33
Developed with CodeLauncher
♥ Do have faith in what you're doing.