在很久很久以前,那时的计算机还没有操作系统这种东西,所以只能有一个程序,从头到尾地跑。于是这个程序要负责使用所有的资源,还得响应外部请求。想想这个程序得多复杂啊——为了做成一件事,可能要先把内存啊、IO啊这些外缘的东西搞定,而且在做事的时候还不能及时响应用户的请求。同时,由于这个程序一次只能做同一件事情,在某种程度上相当于浪费了宝贵的计算机资源。

于是,大神们发明了操作系统。在操作系统中,许多进程可以同时执行,操作系统给它们提供可以共享的资源——内存,file handle,以及安全凭证等。这样就可以提升运行的效率了,因为不同进程可以各自去做一些独立的事情,访问相关的系统资源;同时,由于可以使用不同的进程去解决不同的问题,也给程序员编程带来了便利。

在早期的操作系统中,每个进程都是一个虚拟的冯·诺依曼结构,程序中的指令是被顺序执行的,也就是说程序的控制流在程序执行之前就是确定的。这个串行执行的模型听起来非常简单,但是过了一段时间以后人们不禁开始思考:这是最好的做法吗?

在人类的日常生活中,经常需要“同时”去处理许多事情,比如做早饭时,把壶架在火上开始烧水,同时把吐司放进烤面包机,然后开始刷牙、洗脸,直到水烧开、面包烤好……人类很聪明,不会站在那里等待水烧开才去烤面包,因为这样做不仅水会凉,更主要的是会浪费时间。把水壶放在灶上,利用烧水的时间去做别的事,而水烧开时,水壶会自动发出声音提醒你水已经烧好了,这个过程在计算机的消息通信机制中有个术语,叫做“异步”。相反,一直站在那里等水烧开了才去做下一步的事情,叫做“同步”。高效的程序需要在串行和异步之间寻找一个平衡。

基于这种“同时做好几件事”的考虑,大神们把进程的发明更进一步,创造了线程。同一个进程中的线程可以共享内存和file handle等资源,但每个线程还有自己的program counter, 栈和局部变量等。这就相当于把进程带来的并行性又增强到一个更细的粒度。多线程的一个显著的优势在于高效的资源利用——在许多操作系统中,线程是最小的调度单位。多个线程可以同时被分配到多个CPU上被执行。几乎可以说,在多核系统上,不使用多线程是对系统资源的一种浪费。

除此之外,如果一个程序中有大量的不同性质的任务要做,我们可以把他们划分到不同的线程中进行处理,使它们成为各自独立的任务,这样大大降低了编程的难度。多线程的存在也大大提升了程序UI的响应度。在UI系统中,设置一个分发线程去听取用户的请求,收到请求后交给其他线程去做复杂的操作和处理,比用单线程进行处理好很多。如果在单线程UI中进行复杂的长时间操作,会让整个UI失去反应,而且无法取消当前的操作。

当然,多线程也为程序员带来了许多挑战。其中最大的挑战是,程序员需要努力不使自己的程序出现线程安全问题。 拿Java举例,如果多个线程同时访问某个数据,且访问时没有足够的同步机制,会导致一种叫做race condition的现象,即程序的运行结果与多线程被调度的时间先后顺序有关,这是我们不希望出现的——我们希望在前置条件一定的情况下,每次运行的结果都是相同的。比如单例模式中,某个类必须最多只有一个对象产生。

另外,多线程程序比单线程程序容易出现liveness问题,比如死锁。多线程的调度和上下文切换也是有代价的,会造成一些额外的性能开销。那么我们在什么情况下才去使用多线程,怎么去规避这些问题呢?这就是本书作者们会贯彻全书给我们讲解的问题。

[JCIP笔记] (一)多线程的起源的更多相关文章

  1. 孙鑫VC学习笔记:多线程编程

    孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modified ...

  2. Python 爬虫笔记、多线程、xml解析、基础笔记(不定时更新)

    1  Python学习网址:http://www.runoob.com/python/python-multithreading.html

  3. [JCIP笔记] (二)当我们谈线程安全时,我们在谈论什么

    总听组里几个大神说起线程安全问题.本来对"线程安全"这个定义拿捏得就不是很准,更令人困惑的是,大神们用这个词指代的对象不仅抽象而且千变万化.比如,我们的架构师昨天说: " ...

  4. [JCIP笔记](四)踩在巨人的肩上

    读完第三章那些繁琐的术语和细节,头疼了整整一个星期.作者简直是苦口婆心,说得我如做梦一般.然而进入第四章,难度骤然降低,仿佛坐杭州的过山公交车突然下坡,鸟鸣花香扑面而来,看到了一片西湖美景. 从开始看 ...

  5. [心得笔记]Java多线程中的内存模型

    一:现代计算机的高速缓存 在计算机组成原理中讲到,现代计算机为了匹配 计算机存储设备的读写速度 与  处理器运算速度,在CPU和内存设备之间加入了一个名为Cache的高速缓存设备来作为缓冲:将运算需要 ...

  6. JUC学习笔记--Thread多线程基础

    实现多线程的两种方法 java 实现多线程通过两种方式1.继承Thread类 ,2.实现Runnable接口 class Newthead extends Thread{ public void ru ...

  7. Android应用开发学习笔记之多线程与Handler消息处理机制

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 和JAVA一样,Android下我们可以通过创建一个Thread对象实现多线程.Thread类有多个构造函数,一般通 ...

  8. 毕向东udp学习笔记3多线程聊天

    项目功能: 实现了多线程下的发送接收,比较好 希望可以加入GUI,类似聊天软件一样,有一个消息输入框,捕获输入消息,作为发送线程 有一个显示消息框,接收消息并显示,作为接收线程 不知道的是,当在线程中 ...

  9. [JCIP笔记] (三)如何设计一个线程安全的对象

    在当我们谈论线程安全时,我们在谈论什么中,我们讨论了怎样通过Java的synchronize机制去避免几个线程同时访问一个变量时发生问题.忧国忧民的Brian Goetz大神在多年的开发过程中,也悟到 ...

随机推荐

  1. C++ explicit关键字详解(转载)

    转载:https://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函 ...

  2. 微信浏览器返回刷新,监听微信浏览器返回事件,网页防复制,移动端禁止图片长按和vivo手机点击img标签放大图片

    以下代码都经过iphone7,华为MT7 ,谷歌浏览器,微信开发者工具,PC端微信验证.如有bug,还请在评论区留言. demo链接:https://pan.baidu.com/s/1c35mbjM ...

  3. Entity Framework VS Mybatis 不同点剖析

    大家都知道Entity Framework是.NET系统当中的一个重量级的ORM框架 ,它采用了延迟加载的技术,使得服务端不用每次都去尝试连接数据库,从而增加了使用效率和 减少了不必要的开销.而myb ...

  4. 自动化测试KPI考评的一种方法

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6856204.html 众所周知,在IT ...

  5. Spring MVC Mock demo

    package com.niwodai.mem.web.controller; import com.alibaba.fastjson.JSON; import org.junit.Before; i ...

  6. MySQL连接数实时查看

      MySQL连接数实时查看 1.查看当前所有连接详细信息,只显示10个 2.查看连接状态 箭头所指的地方一般最重要,表示当前的连接数有多少个 3.查看所有连接的详细信息 4.实时查看连接详细信息 这 ...

  7. Java设计模式——装饰模式

    转载自:http://blog.csdn.net/xu__cg/article/details/53024490 抽象构件 public interface CarInterface { void m ...

  8. CNN网络架构演进:从LeNet到DenseNet

    卷积神经网络可谓是现在深度学习领域中大红大紫的网络框架,尤其在计算机视觉领域更是一枝独秀.CNN从90年代的LeNet开始,21世纪初沉寂了10年,直到12年AlexNet开始又再焕发第二春,从ZF ...

  9. 深度学习(一。深度学习概览)(mooc视频https://www.icourse163.org/learn/MSRA-1002255002?tid=1002370003#/learn/content?type=detail&id=1003271123)

    一. 深度学习概览 1.为什么resnet应用在图像识别 因为传统神经网络精度有限,而只是增加层数无法提高精度.而resnet可以改变这个问题. 2.Microsoft SwitchBoard 在语音 ...

  10. Maven项目中的配置文件找不到以及打包问题

    我们在使用maven开发项目的时候,创建model的时候会自动创建一个resource目录:这个目录是用来放配置文件的,我们把配置文件放在这个目录中项目打包才会将配置文件打包进去. 有的时候我们会把配 ...