《Java并发编程实战》读书笔记-第1章 简介

并发简史

在早期的计算机中不包含操作系统,从头至尾都只执行一个程序,并且这个程序能访问计算机所有资源。操作系统的出现使得计算机每次能运行多个程序,并且不同的程序都在单独的进程中运行:操作系统为各个独立执行的进程分配内存、文件句柄、安全证书等。不同进程之间通过一些粗粒度的通信机制交换数据,包括:套接字、信号处理器、共享内存、信号量以及文件等。
之所以在计算机中加入操作系统来实现多个程序同时执行,主要基于以下原因:

资源利用率:在某些情况下,程序如果在等待某个外部操作执行完成的同时,可以运行另一个程序,那无疑将提高资源的利用率。
公平性:通过粗粒度的时间分片运行方式,使得不同的用户和程序对于计算机上的资源有着共同的使用权。
便利性:计算多个任务时,编写多个程序,每个程序执行一个任务并在必要时相互通信,比之编写一个程序来计算所有任务更容易实现。

这些促使进程出现的因素同样也促使着线程的出现。线程允许同一个进程中同时存在多个程序控制流。线程会共享进程范围内的资源(内存、文件句柄),但每个线程都有各自的程序计数器、栈、局部变量等。一个程序中的多个线程也可以同时被调度到多个CPU上运行。

线程也被称为轻量级进程。现代操作系统中,都是以线程为基本的调度单位,而不是进程。

线程的优势

发挥多处理器的强大能力
建模的简单性
异步事件的简化处理
响应更灵敏的用户界面

线程带来的风险

安全性问题
多个线程同时访问和修改相同的变量时,会发生无法预料的数据变化,导致线程出现错误

活跃性问题
当某个操作无法继续执行下去时:死锁、饥饿、活锁

性能问题
多线程程序中不仅存在于单线程程序相同的性能问题(服务时间过长、响应不灵敏、吞吐率过低、资源消耗过高、可伸缩行较低等),而且还存在由于使用线程而引入的其他性能问题:

  • 在多线程程序中,当线程调度器临时挂起活跃线程并转而运行另一个线程时,会频繁的出现上下文切换操作(Context
    Switch),这种操作将带来极大的开销:保存和恢复执行上下文,丢失局部性,CPU花更多的时间在线程调度而不是线程运行上。
  • 使用同步机制操作共享数据时,会抑制编译器优化,是内存缓存区中的数据无效,以及增加共享内存总线的同步流量

猜你喜欢

转载自www.cnblogs.com/zeekik/p/11735672.html
今日推荐