java 的虚拟线程还是挺让人失望的。

用虚拟线程跑了一下,虽然没有系统线程切换开销了,但是 ThreadPerTaskExecutor 在8核cpu跑16个虚拟线程的结果,还不如开16个Thread直接跑快,执行200条sql平均时间比虚拟线程快了一倍。

java 的虚拟线程还是没有优化好,我估计代码中运行到一些特殊的地方导致当前虚拟线程会阻塞系统线程从而变慢。比如在jdbc客户端执行sql的所有代码中一定会遇到synchronized的代码的,虚拟线程遇到synchronized就会阻塞系统线程,因为ThreadPerTaskExecutor内部只开了8个系统线程,如果其中之一被阻塞了,自然就影响跟它相关的所有虚拟线程。

@zhh-4096

当并发的线程数远超 cpu 核数时,在每个线程中连续执行200条和2000条 sql 然后计算每条 sql 的执行时间,居然会有很大差异,执行200条 sql 时算出的平均时间更小。可能是受操作系统时间分片算法的影响,执行2000条 sql 时线程被切换的次数增多,所以总时间里把线程切换的时间算在内就变多了。 ​​​

Reply to this note

Please Login to reply.

Discussion

No replies yet.