V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hexzhou
V2EX  ›  Java

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

  •  
  •   hexzhou · 2016-07-13 01:27:21 +08:00 · 2809 次点击
    这是一个创建于 3079 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在看 java1.8 Collections 类的源码中,发现 shuffle method 中有这种往复赋值的操作,不是很理解这样做的用途,求解答。谢谢大家。
    [Imgur]( )
    4 条回复    2016-07-13 15:39:54 +08:00
    SoloCompany
        1
    SoloCompany  
       2016-07-13 02:42:35 +08:00   ❤️ 1
    单例+lazy init 而已( j8 还没有像 kotlin 那样原生带 lazy 真忧伤)
    这说明了 Random 的实现应该是线程安全的
    lowzoom
        2
    lowzoom  
       2016-07-13 08:11:51 +08:00
    应该纯粹就是省代码,不想写成两行+中括号而已
    hexzhou
        3
    hexzhou  
    OP
       2016-07-13 15:22:47 +08:00
    @SoloCompany 其实我的问题更加准确点说,是说为什么不直接 if ( r == null ) r = new Random(); (之前的 API 好像是这样实现的),而要引入一个新的变量 rnd ,这里面有什么特殊的目的吗?
    SoloCompany
        4
    SoloCompany  
       2016-07-13 15:39:54 +08:00
    不使用局部变量的话, r 的声明应该要加 volatile 才比较安全,估计还是典型的 DCL 问题( Double Check Locking ),其实那一句 harmless race 备注已经基本上说明了意图了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5120 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 05:51 · PVG 13:51 · LAX 21:51 · JFK 00:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.