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

什么是多线程?

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

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

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

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

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

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

多线程的优势

一般网络/磁盘io比cpu和内存运算慢得多,利用这一点,能够在程序等待io时,尽量的利用cpu作其余事情,提高资源利用率.post

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

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

多线程的缺点

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

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

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

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

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

下一篇: 建立和启动线程

相关文章
相关标签/搜索