【Java并发编程的艺术】第一章读书笔记

前言

并发编程的目的是让程序跑的更快,但并非启动更多的线程,这个程序就跑的更快。有如下几种挑战。算法

挑战及方案

上下文切换

单核CPU上执行多线程任务,经过给每一个线程分配CPU时间片的方式来实现这个机制。时间片是CPU分配给每一个线程运行的时间,时间片很是短,CPU经过不断的切换线程执行,给咱们人类留下的印象就是多个线程在同时执行。数据库

因为线程有建立和上下文切换的开销,当整个程序内部操做数不高的状况下,并发执行可能比串行执行来的慢。编程

尽量下降上下文切换的次数,有助于提升并发效率。多线程

  1. 无锁并发编程。书中提到多线程竞争锁时会发生上下文切换,因此竟可能避免使用锁书中指的应该是为了竞争锁而触发的抢占式上下文切换,由于平常多线程运行也须要上下文切换,能够经过不一样线程处理不一样分段的数据来下降。
  2. CAS算法。Java中的Atomic包使用CAS算法来更新数据,不须要加锁CAS算法目前还不是很了解
  3. 使用最少线程。
  4. 协程。协程,又称微线程,纤程。英文名Coroutine。指的是在单线程里面实现多任务的调度以前在Python和Go里面听过这个概念,不过还没作具体了解。

死锁

并发编程中的另外一挑战是死锁,会形成系统功能不可用。死锁是指两个或两个以上的进程或者线程在执行过程当中,因为竞争资源或者因为彼此通讯而形成的一种阻塞的现象。并发

避免死锁的常见方法:高并发

  1. 避免一个线程同时获取多个锁。
  2. 尽量保证一个锁内只占有一个资源。
  3. 尝试使用定时锁。

资源限制的挑战

好比说带宽只有2Mb/s,你下载速度是1Mb/s,开10个线程速度也不会变成10Mb/s。书中提到在并发编程时须要考虑到资源上的限制。若是受制于资源,好比我数据库链接数就10个,你每次用完都新建线程来作链接,总体程序的速度确定会慢下来。线程

解决的方法有如下几点:协程

  1. 对于硬件资源的限制,能够使用集群来跑。
  2. 对于软件资源上的限制,能够复用资源,好比复用数据库链接。

根据资源的限制,灵活的去调整并发度。进程

相关文章
相关标签/搜索