
使用 TestNG 模拟 20 个线程 调用 10000 次,有概率都能重现这个错误
有老哥研究过么?
测试用例:
https://gist.github.com/corningsun/a9a0527edc2f5dc5f3659424d1b8a224
1 tesguest123 Mar 12, 2021 via iPhone 时间不是一直在走嘛…… |
2 dqzcwxb Mar 12, 2021 妙 |
3 jwenjian Mar 12, 2021 via iPhone 可能是 JDK 的 bug [doge] |
4 anonydmer Mar 12, 2021 不是,他那问题是个典型并发问题。。。 |
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 |
6 RedBeanIce Mar 12, 2021 可能是 JDK 的 bug [doge] |
7 anonydmer Mar 12, 2021 楼上的兄弟们,他那个时间是在每次测试之前重新赋值了的,@BeforeMethod 干的;但是他的测试方法是个多线程运行的,一组线程每个来运行测试前都执行一遍赋值,个个去改那个变量由不做任何同步,并发下能一致才见了鬼了 |
8 jwenjian Mar 12, 2021 via iPhone 本地打不开 gist 挂了代理才看见,那不是 JDK 的 bug,是楼主自己的 bug |
9 dreamist Mar 12, 2021 典型的线程安全问题,这是因为 setUp() 和 testDateGetTime2 这两个方法的顺序执行不是线程安全的,同时他们之间有共享变量。把 date 和 time 都加上 volatile,同时把 setUp 和 testDateGetTime2 都加上 synchronized 应该就可以了。看起来是因为 testNG 内部没有处理 setUp 方法和测试方法的线程安全问题。 |
10 anonydmer Mar 12, 2021 怎么能怪 TestNG 呢 |
11 cppgohan Mar 12, 2021 并行多线程跑用例, setup 初始化的 date 却是全局共享的字段. 给 date 改成 thread local 吧 |
12 shyling Mar 12, 2021 建议把 testDateGetTime 删掉 |
13 qwerthhusn Mar 12, 2021 at BeforeMethod 会在每次 at Test 之前执行一次,这样就不线程安全了 |
14 newmlp Mar 12, 2021 恭喜你发现了 jdk 的 bug,屁啊怎么可能,肯定是你的测试代码有问题啊, |
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 地址打印一下 |
16 corningsun OP @anonydmer 哈哈哈哈,看来确实是这样的,换成 @BeforeClass 就没问题了,谢谢。 @pkookp8 Date date 和 long time 是不同的类型,地址肯定不一样的。 问题还是共享变量导致的 |
17 pkookp8 Mar 14, 2021 |