首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
华为云
V2EX  ›  crossoverJie  ›  全部回复第 1 页 / 共 22 页
回复总数  426
1  2  3  4  5  6  7  8  9  10 ... 22  
6 天前
回复了 crossoverJie 创建的主题 程序员 如何成为一位「不那么差」的程序员
6 天前
回复了 crossoverJie 创建的主题 程序员 如何成为一位「不那么差」的程序员
@XXneet #23 多谢支持
6 天前
回复了 crossoverJie 创建的主题 程序员 如何成为一位「不那么差」的程序员
6 天前
回复了 crossoverJie 创建的主题 程序员 如何成为一位「不那么差」的程序员
@zhengxiaowai #19 把涉及到 Java 的去掉,我觉得大部分开发都适合。
6 天前
回复了 crossoverJie 创建的主题 程序员 如何成为一位「不那么差」的程序员
6 天前
回复了 crossoverJie 创建的主题 程序员 如何成为一位「不那么差」的程序员
@kios 是的 还是要多实践
6 天前
回复了 crossoverJie 创建的主题 程序员 如何成为一位「不那么差」的程序员
@michaelcheng 嗯 现在就家里上厕所的时候翻翻
6 天前
回复了 crossoverJie 创建的主题 程序员 如何成为一位「不那么差」的程序员
@crossoverJie #4 顺便。。
6 天前
回复了 crossoverJie 创建的主题 程序员 如何成为一位「不那么差」的程序员
@abmin521 #3 随便宣传一波 不过这篇真心撸了很久 https://ws3.sinaimg.cn/bmiddle/62e721e4gw1et02ek7u61j200k00k3y9.jpg
23 天前
回复了 swj 创建的主题 问与答 朱军,有么有好的开源 Java 项目介绍一下
@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
@zpxshl #40 兄弟,我觉得这没有啥问题呀。

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

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

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

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

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

如果当前位置依然为空的话就会重复上面的步骤。
@zpxshl #38 如何保证其他线程见到你的修改?

其他线程在 tabAt()

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

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

get 的时候也是一样的:

https://ws3.sinaimg.cn/large/006tNc79ly1ftlwdb31v2j31620k2djy.jpg
@zpxshl #36 嗯 你不是问的怎么保证可见性嘛,获取到的是最新值就不会有可见性的问题了。
@zpxshl #34

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

tabAt() 方法,它所依赖的是 Unsafe 包中的 getObjectVolatile() 可以保证可见性。
@shiguiyou #31 多等等 卡。。
@zxq1002 #28 确实挺慢的,准备转到国内了。
@WildCat #25 👍 咋搞的呀,可以提个 Issue。

https://github.com/crossoverJie/Java-Interview/issues/new
1  2  3  4  5  6  7  8  9  10 ... 22  
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   实用小工具   ·   1903 人在线   最高记录 3762   ·  
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.1 · 23ms · UTC 15:16 · PVG 23:16 · LAX 08:16 · JFK 11:16
♥ Do have faith in what you're doing.
沪ICP备16043287号-1