Java当初最吸引人的就是它的并发。并发的目的是为了让程序运行的更快,但是并不是启动更多的线程速度就快了。我们面临很多的挑战,比如上下文的切换、死锁,以及受限于硬件和软件资源等问题。
一、上下文切换
即使是单核处理器也支持多线程,CPU通过给每个线程分配时间片来实现这个机制,快速的切换就会让我们觉得是多个线程是同时进行的,当然多处理器的确是可以多个线程同时运行。
把代码中count的值从100001提高到100000001的一个时间对比如下:
100001:concurrency time is 3 ms, serial time is 2 ms
1000001:concurrency time is 4 ms, serial time is 6 ms
10000001:concurrency time is 8 ms, serial time is 15 ms
100000001:concurrency time is 47 ms, serial time is 73 ms
从上面的数据可以看出来(每个人的电脑有些许差异),并发执行不超过百万的时候,串行的速度会比并发执行快。原因是因为上下文的切换是要消耗性能的。
linux下可以通过vmstat命令来查看相关信息:
倒数第六个表示上下文每秒切换的次数。