计算机CPU通过给每个线程分配时间片的方式了支持多线程。当前线程执行一段时间之后,会保存状态,切换到下一个线程执行任务。线程的上下文切换也是需要时间消耗的。因为系统中的线程数不是越多越好。线程数越多,上下文切换时间越长。在linux 系统中,我们可以使用vmstat 1 命令查看一下当前的上下文切换时间。
>
root@ubuntu:~# vmstat 1
procs ———–memory———- —swap– —–io—- -system– —-cpu—-
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 0
0 0 0 3499584 315836 3819660 0 0 0 0 88 158 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 2 86 162 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 10 81 151 0 0 100 0
1 0 0 3499732 315836 3819660 0 0 0 2 83 154 0 0 100 0
其中cs 标识上下文的切换次数。为了减少上下文的切换,可以采取三种方式。
1. 无锁的并发编程 。比如按照ID HASH取模分段的方式,不同的线程处理不用的数据。类似 jdk的ConcurrentHashMap的分段实现方式。
2. CAS算法,可以使用java 的 atomic包中的CAS算法来更新数据,不需要加锁
3. 使用最小线程。避免创建不必要的线程
4. 协程:在单线程模型里面实现多任务的调度,并维持多任务的切换