Basic Of Concurrency(一:如何理解多线程)

1,837 阅读4分钟

什么是多线程?

单任务,单cpu时代,一个时间点仅能运行单一程序,程序可以独占资源.

多任务,单cpu时代,一个时间点能够运行多个程序,程序必须共享资源.然而这并不是真正意义上的运行多个程序.而是统一由操作系统为多个程序分配cpu运行时间片,让cpu在不同的任务中切换运行.

多任务,单cpu对开发者设计软件时提出了新的挑战,即假设程序不使用计算机资源后需要立即释放资源,以供其他程序使用,提升计算机资源利用率.

而后发展至多线程技术,即让一个程序内部拥有多个线程并行执行,并行程度取决于cpu的核心以及线程数量.不同的线程有可能被分配到不同的cpu上执行,因此一个程序运行在多线程下,即能够被多个cpu同时执行.

多cpu多线程相较于多任务对开发者设计软件时提出了更加苛刻的挑战,多线程带来的问题在以往单cpu时代闻所未闻.多线程在同一程序内并行执行,造成比较直观的问题是会产生并发的读写操作,且顺序随机,对其产生的输出结果完全无法预估.

并发的读写问题仅会在一个读一个写或两个写操作并行执行的场景下产生.如一个线程往内存中读取数值,另一个线程往内存中写数值,两个线程执行完毕后无法预估读线程读取到的数值到底是更新前的数值还是更新后的数值,或是两个数值的混合体.两个写操作也同样如此,是第一个写操作写入的值还是第二个写操作写入的值,或是两个写操作的混合值.

多线程的优点

通常网络/磁盘io比cpu和内存运算慢得多,利用这一点,可以在程序等待io时,尽可能的利用cpu做其他事情,提升资源利用率.

对没有状态共享行为的任务,多线程有利于编写处理程序和提升处理速度.如对多个文本文件中的相同字符出现次数进行统计,可以利用多线程对多个文本文件分别进行统计再累计所有线程统计出来的数目得到最终的统计值.

利用多线程可以设计出响应速度更快的程序.对于拥有界面的应用,可以利用1+n的线程模式,让一个线程负责响应界面事件和接收事件处理结果,多个界面事件将在线程池中去处理,处理完毕后再将结果传递给界面线程.以此来达到提升程序响应速度的效果.

多线程的缺点

tips: 应该多测量一下应用程序的性能和响应能力(硬件性能+软件性能综合决定了应用的性能,软件性能对应用综合性能的影响较大).

多线程在涉及到状态共享时,对程序的设计将变得十分复杂.需要对程序施加一定的同步措施,且不正确的同步措施将会带来不可预期的结果,所以对开发人员多线程编程技能的掌握程度要求较高.

多线程的切换一定程度上需要更换本地的上下文数据,即在运行下一个线程时需要暂存上一个线程的执行数据.频繁的上下文切换必然会造成资源浪费.如无必要,尽量不让线程进行上下文切换.

计算机中让多个线程保持活跃必然需要一定的资源,即需要一定的内存来维持每个线程的堆栈信息.也需要操作系统调配一定的资源来管理线程.大量无用且活跃的线程会占用大量的计算机资源.

该系列博文为笔者复习基础所著译文或理解后的产物,复习原文来自Jakob Jenkov所著Java Concurrency and Multithreading Tutorial

下一篇: 创建和启动线程