V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  crossoverJie  ›  全部回复第 16 页 / 共 36 页
回复总数  720
1 ... 12  13  14  15  16  17  18  19  20  21 ... 36  
2018 年 8 月 13 日
回复了 crossoverJie 创建的主题 程序员 如何成为一位「不那么差」的程序员
@michaelcheng 嗯 现在就家里上厕所的时候翻翻
2018 年 8 月 13 日
回复了 crossoverJie 创建的主题 程序员 如何成为一位「不那么差」的程序员
@crossoverJie #4 顺便。。
2018 年 8 月 13 日
回复了 crossoverJie 创建的主题 程序员 如何成为一位「不那么差」的程序员
@abmin521 #3 随便宣传一波 不过这篇真心撸了很久 https://ws3.sinaimg.cn/bmiddle/62e721e4gw1et02ek7u61j200k00k3y9.jpg
2018 年 7 月 27 日
回复了 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 年 7 月 25 日
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@zpxshl #40 兄弟,我觉得这没有啥问题呀。

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

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

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

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

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

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

其他线程在 tabAt()

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

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

get 的时候也是一样的:

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

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

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

https://github.com/crossoverJie/Java-Interview/issues/new
2018 年 7 月 23 日
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@LuckCode #24 哈哈 我这是广撒网啊 你也是哪个网都钻进来了 https://ws1.sinaimg.cn/large/b64a58e3gy1fikr7bnfrmj200k00k0sh.jpg
2018 年 7 月 23 日
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@liuzhen #20 可以的。
2018 年 7 月 23 日
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@llxx510200 #18 这个我觉得能讲清楚为啥快,啥时候翻转这些就差不多了。具体实现确实很复杂
2018 年 7 月 23 日
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@orm #14 看来迁回国内得提上议程了。
2018 年 7 月 23 日
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
@alamaya #15 嗯 扩容那块很复杂,得单独拿一篇讲才行。
2018 年 7 月 23 日
回复了 crossoverJie 创建的主题 程序员 HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
1 ... 12  13  14  15  16  17  18  19  20  21 ... 36  
关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   4972 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 25ms · UTC 06:09 · PVG 14:09 · LAX 22:09 · JFK 01:09
♥ Do have faith in what you're doing.