Java .util.Date.getTime() 两次调用不相等 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
corningsun
0.05D
V2EX    Java

Java .util.Date.getTime() 两次调用不相等

  •  
  •   corningsun Mar 12, 2021 2981 views
    This topic created in 1873 days ago, the information mentioned may be changed or developed.

    使用 TestNG 模拟 20 个线程 调用 10000 次,有概率都能重现这个错误

    有老哥研究过么?

    测试用例:

    https://gist.github.com/corningsun/a9a0527edc2f5dc5f3659424d1b8a224

    17 replies    2021-03-14 11:51:01 +08:00
    tesguest123
        1
    tesguest123  
       Mar 12, 2021 via iPhone
    时间不是一直在走嘛……
    dqzcwxb
        2
    dqzcwxb  
       Mar 12, 2021
    jwenjian
        3
    jwenjian  
       Mar 12, 2021 via iPhone   2
    可能是 JDK 的 bug [doge]
    anonydmer
        4
    anonydmer  
       Mar 12, 2021
    不是,他那问题是个典型并发问题。。。
    yazoox
        5
    yazoox  
       Mar 12, 2021
    永远都不会相等吧?相等那就是 bug 了......
    The java.util.Date.getTime() method returns how many milliseconds have passed since January 1, 1970, 00:00:00 GMT

    google 了一下:
    https://www.tutorialspoint.com/java/util/date_gettime.htm
    RedBeanIce
        6
    RedBeanIce  
       Mar 12, 2021
    可能是 JDK 的 bug [doge]
    anonydmer
        7
    anonydmer  
       Mar 12, 2021
    楼上的兄弟们,他那个时间是在每次测试之前重新赋值了的,@BeforeMethod 干的;但是他的测试方法是个多线程运行的,一组线程每个来运行测试前都执行一遍赋值,个个去改那个变量由不做任何同步,并发下能一致才见了鬼了
    jwenjian
        8
    jwenjian  
       Mar 12, 2021 via iPhone
    本地打不开 gist 挂了代理才看见,那不是 JDK 的 bug,是楼主自己的 bug
    dreamist
        9
    dreamist  
       Mar 12, 2021   1
    典型的线程安全问题,这是因为 setUp() 和 testDateGetTime2 这两个方法的顺序执行不是线程安全的,同时他们之间有共享变量。把 date 和 time 都加上 volatile,同时把 setUp 和 testDateGetTime2 都加上 synchronized 应该就可以了。看起来是因为 testNG 内部没有处理 setUp 方法和测试方法的线程安全问题。
    anonydmer
        10
    anonydmer  
       Mar 12, 2021
    怎么能怪 TestNG 呢
    cppgohan
        11
    cppgohan  
       Mar 12, 2021
    并行多线程跑用例, setup 初始化的 date 却是全局共享的字段. 给 date 改成 thread local 吧
    shyling
        12
    shyling  
       Mar 12, 2021
    建议把 testDateGetTime 删掉
    qwerthhusn
        13
    qwerthhusn  
       Mar 12, 2021
    at BeforeMethod 会在每次 at Test 之前执行一次,这样就不线程安全了
    newmlp
        14
    newmlp  
       Mar 12, 2021
    恭喜你发现了 jdk 的 bug,屁啊怎么可能,肯定是你的测试代码有问题啊,
    pkookp8
        15
    pkookp8  
       Mar 12, 2021
    刚开始学 java
    是不是多线程并发问题?
    before test 初始化了 date 和 time
    date = new Date();
    time = date.getTime();
    单线程的时候 date.getTime()一定等于 time
    多线程进行测试,是不是共用了 date ?导致另一个线程初始化了 date,还没初始化 time,所以 time 和 date.getTime()不相等?
    java 可以打印地址嘛,把 date 和 time 地址打印一下
    corningsun
        16
    corningsun  
    OP
       Mar 14, 2021
    @anonydmer
    哈哈哈哈,看来确实是这样的,换成 @BeforeClass 就没问题了,谢谢。


    @pkookp8
    Date date 和 long time 是不同的类型,地址肯定不一样的。
    问题还是共享变量导致的
    pkookp8
        17
    pkookp8  
       Mar 14, 2021
    @corningsun 我没表述清楚。
    我想比较不同线程下的 date 地址
    不是说 date 和 time 的地址一样。
    About     Help     Advertise     Blog     API     FAQ     Solana     5842 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 66ms UTC 06:35 PVG 14:35 LAX 23:35 JFK 02:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86