Collections.shuffle 中出现的 r=rnd=new Random()的疑问

2016-07-13 01:27:21 +08:00
 hexzhou
在看 java1.8 Collections 类的源码中,发现 shuffle method 中有这种往复赋值的操作,不是很理解这样做的用途,求解答。谢谢大家。
[Imgur]( )
2667 次点击
所在节点    Java
4 条回复
SoloCompany
2016-07-13 02:42:35 +08:00
单例+lazy init 而已( j8 还没有像 kotlin 那样原生带 lazy 真忧伤)
这说明了 Random 的实现应该是线程安全的
lowzoom
2016-07-13 08:11:51 +08:00
应该纯粹就是省代码,不想写成两行+中括号而已
hexzhou
2016-07-13 15:22:47 +08:00
@SoloCompany 其实我的问题更加准确点说,是说为什么不直接 if ( r == null ) r = new Random(); (之前的 API 好像是这样实现的),而要引入一个新的变量 rnd ,这里面有什么特殊的目的吗?
SoloCompany
2016-07-13 15:39:54 +08:00
不使用局部变量的话, r 的声明应该要加 volatile 才比较安全,估计还是典型的 DCL 问题( Double Check Locking ),其实那一句 harmless race 备注已经基本上说明了意图了

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

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

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

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

© 2021 V2EX