《Java并发编程实践》读书笔记(一)

并发的历史

1. 推动多进程发展的因素

  • 资源利用.当等待一个线程执行外部操作的时候,另外一个线程可以进行有价值的工作,提高工作效率
  • 公平.多个用户或者程序对系统资源资源有平等的优先级
  • 方便.执行多进程比单进程更加容易

线程的概念

推动多进程发展也促进了多线程的发展.线程允许程序控制流的多重分支同时存在于一个进程中.他们共享进程范围内的资源,比如内存和文件句柄,但是每个线程都有自己的程序计数器,栈和本地变量

轻量级进程

线程有时候被称为轻量级线程,线程是作为系统时序调度的基本单元.

线程与进程

线程共享于所属的进程中的内存地址空间,可以访问相同变量,并且同一个堆中分配对象,这相当于进程间通信机制来实现了良好的数据共享.多线程操作的时候需要注意数据的安全管理,防止意外的结果.

2. 线程的优点

线程的优点总的来讲有:

  • 降低开发和维护的开销,提高负责应用的性能
  • 模拟用户工作和交互变得更加容易
  • 代码更加易于读写和维护
  • 改善请求接口的响应性
  • 提高资源利用率和吞吐率
  • 简化了JVM的GC的实现

使用多处理器

多线程在单核处理器跟多核处理器中能够有效利用空闲处理器资源,来提高吞吐量.但是在多核处理器上表现更加,如果现在单核处理需要的争取设备在处理IO或者其他不涉及CPU资源的动作上才能争取

模型的简化

第三方框架简化了多线程操作.比如 Servlets 框架把请求管理,线程创建和负载均衡等操作全部实现,降低开发者学习曲线减缓.也就说开发者可以享受多线程带来的便利的同时降低了学习的成本

对异步事件的处理

多线程下使用同步IO会提高效率,使用异步IO更容易出错

用户界面更加响应性

避免了单线程情况下,主线程耗时操作导致UI无法响应

3. 线程的风险

什么是线程安全性

因为线程相同的内存空间,并且并发地运行,他们可能访问或者修改其他线程正在试用的变量,在享受数据共享便利的同时,也蕴藏了巨大的风险.当数据意外改变的时候,线程可能会出现混乱.允许多线程访问以及修改变量,给顺序编程模型引入一些费顺序因素,这可能造成混乱,并且难以发现错误.为了使多线程程序的行为可预见性,访问共享的变量必须经过合理的协调,这样线程才不会相互干扰.

在缺少同步的时候,编译器,硬件和运行时事实上对时间和活动顺序是很随意的,比如在寄存器或者高速缓存中存储变量,这样会使他们对于线程暂时不可见,但是这样给性能提高的同时给开发带来的负担

活跃度的危险

当一个活动进入某种它无法再继续执行的状态时,活跃度失败就发生了.活跃度失败包括死锁, 饥饿,活锁

性能危险

线程切换带来一定程度的开销:

  • 保存跟恢复线程执行的上下文,离开执行现场
  • CPU会把花费在线程的调度上而不是运行处理上
  • 当线程共享数据的时候他们必须使用同步,这个机制会限制编译器优化,能够清空或者锁定内存跟高速缓存,并且在总线上创建同步机制

猜你喜欢

转载自blog.csdn.net/sinat_27154507/article/details/80597637