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

2021-03-12 16:39:41 +08:00
 corningsun

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

有老哥研究过么?

测试用例:

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

2568 次点击
所在节点    Java
17 条回复
tesguest123
2021-03-12 16:57:14 +08:00
时间不是一直在走嘛……
dqzcwxb
2021-03-12 16:59:58 +08:00
jwenjian
2021-03-12 17:01:12 +08:00
可能是 JDK 的 bug [doge]
anonydmer
2021-03-12 17:01:18 +08:00
不是,他那问题是个典型并发问题。。。
yazoox
2021-03-12 17:01:24 +08:00
永远都不会相等吧?相等那就是 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
2021-03-12 17:03:40 +08:00
可能是 JDK 的 bug [doge]
anonydmer
2021-03-12 17:04:27 +08:00
楼上的兄弟们,他那个时间是在每次测试之前重新赋值了的,@BeforeMethod 干的;但是他的测试方法是个多线程运行的,一组线程每个来运行测试前都执行一遍赋值,个个去改那个变量由不做任何同步,并发下能一致才见了鬼了
jwenjian
2021-03-12 17:09:44 +08:00
本地打不开 gist 挂了代理才看见,那不是 JDK 的 bug,是楼主自己的 bug
dreamist
2021-03-12 17:13:28 +08:00
典型的线程安全问题,这是因为 setUp() 和 testDateGetTime2 这两个方法的顺序执行不是线程安全的,同时他们之间有共享变量。把 date 和 time 都加上 volatile,同时把 setUp 和 testDateGetTime2 都加上 synchronized 应该就可以了。看起来是因为 testNG 内部没有处理 setUp 方法和测试方法的线程安全问题。
anonydmer
2021-03-12 17:15:52 +08:00
怎么能怪 TestNG 呢
cppgohan
2021-03-12 17:22:52 +08:00
并行多线程跑用例, setup 初始化的 date 却是全局共享的字段. 给 date 改成 thread local 吧
shyling
2021-03-12 17:32:59 +08:00
建议把 testDateGetTime 删掉
qwerthhusn
2021-03-12 17:53:39 +08:00
at BeforeMethod 会在每次 at Test 之前执行一次,这样就不线程安全了
newmlp
2021-03-12 18:55:06 +08:00
恭喜你发现了 jdk 的 bug,屁啊怎么可能,肯定是你的测试代码有问题啊,
pkookp8
2021-03-12 20:08:36 +08:00
刚开始学 java
是不是多线程并发问题?
before test 初始化了 date 和 time
date = new Date();
time = date.getTime();
单线程的时候 date.getTime()一定等于 time
多线程进行测试,是不是共用了 date ?导致另一个线程初始化了 date,还没初始化 time,所以 time 和 date.getTime()不相等?
java 可以打印地址嘛,把 date 和 time 地址打印一下
corningsun
2021-03-14 08:57:57 +08:00
@anonydmer
哈哈哈哈,看来确实是这样的,换成 @BeforeClass 就没问题了,谢谢。


@pkookp8
Date date 和 long time 是不同的类型,地址肯定不一样的。
问题还是共享变量导致的
pkookp8
2021-03-14 11:51:01 +08:00
@corningsun 我没表述清楚。
我想比较不同线程下的 date 地址
不是说 date 和 time 的地址一样。

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

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

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

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

© 2021 V2EX