俗话说:众人shi柴火焰高。
意思是更多的人去做一件事,往往会去的更好的效果。
在编程的世界里,这个道理依然走的通。只不过这里不再是人,而是线程。让更多的线程去做一件事,在大部分情况下往往有利于提高效率。
也许有人此时会有一个想法:既然存在这样的道理,那我在我的程序中拼命的创建线程,是不是就意味的我的程序运行速度会随之而来的越来越快?答案当然是No的,这样做只能说你太Yong.
第一个问题:上下文切换程
线程:
线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
CPU:
中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。
在单核处理器(单cpu)中也能执行多线程程序,cpu通过给每个线程分配时间片来实现这个机制。
如上图所示:线程1、线程2、线程3,根据cpu内部时间片分配算法被分配得到相应的时间片。线程1在获得时间片1并执行完毕到下次再获得时间片的一个完整过程被称作为一次上下文切换。在java运行时数据区域有一个叫做程序计数器的东西,他会记录线程每次执行的一些指令代码信息,以便线程下次执行的时候能够找到上次的状态等相关信息。
在线程够多、cpu够渣的时候,频繁的上下文切换会导致程序反而变得更慢。
既然上下文切换限制了多线程编程,我们应该怎么解决这个问题呢?
- 无锁多线程编程:多线程变成加锁的原因在于多个线程访问同一个资源,既然如此我们可以将资源分块,不同的线程固定范文不同的资源快。(在集群模式中,我们有一种处理session的思想就是如此)
- CAS算法