Java高并发程序设计---入门

为什么需要并行

  1. 单核CPU性能瓶颈
  2. 并行计算还出于业务模型的需要并不是为了提高系统性能,而是确实在业务上需要多个执行单元。
    – 比如HTTP服务器,为每一个Socket连接新建一个处理线程
    – 让不同线程承担不同的业务工作  (主线程 gc线程)
    – 简化任务调度

并行计算的试用的领域

  1.  图像处理
  2. 服务器端编程

几个重要的概念

 同步(synchronous)和异步(asynchronous)
 并发(Concurrency)和并行(Parallelism)
 临界区
 阻塞(Blocking)和非阻塞(Non-Blocking)
 锁(Deadlock)、饥饿(Starvation)和活锁(Livelock)
 并行的级别

  1. 同步(synchronous)和异步(asynchronous)

同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事

异步:   请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

Java高并发程序设计---入门_第1张图片

 

 

 

 

    2、并发(Concurrency)和并行(Parallelism)

Java高并发程序设计---入门_第2张图片

  3 、临界区

临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程
使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。   

Java高并发程序设计---入门_第3张图片

4、阻塞(Blocking)和非阻塞(Non-Blocking)

阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其他所有需要这个资源的线程就必须在这个临界区中进行等待。等待会导致线程挂起,这种情况就是阻塞。非阻塞的意思与之相反,它强调没有一个线程可以妨碍其他线程执行。所有的线程都会尝试不断前向执行。

阻塞   传统的 IO 流都是阻塞式的。也就是说,当一个线程调用 read() 或 write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务。因此,在完成网络通信进行 IO 操作时,由于线程会阻塞,所以服务器端必须为每个客户端都提供一个独立的线程进行处理,当服务器端需要处理大量客户端时,性能急剧下降

非阻塞  Java NIO 是非阻塞模式的。当线程从某通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务。线程通常将非阻塞 IO 的空闲时间用于在其他通道上执行 IO 操作,所以单独的线程可以管理多个输入和输出通道。因此,NIO 可以让服务器端使用一个或有限几个线程来同时处理连接到服务器端的所有客户端。 

 

5、死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock)

多线程产生死锁的四个必要条件:

互斥条件:一个资源每次只能被一个进程使用。
保持和请求条件:一个进程因请求资源而阻塞时,对已获得资源保持不放。
不可剥夺调教:进程已获得资源,在未使用完成前,不能被剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

 

Java高并发程序设计---入门_第4张图片

 

并发级别

 

阻塞   当一个线程进入临界区后,其他线程必须等待

无饥饿

Java高并发程序设计---入门_第5张图片

无障碍   – 无障碍是一种最弱的非阻塞调度
              – 自由出入临界区
              – 无竞争时,有限步内完成操作
              – 有竞争时,回滚数据

Java高并发程序设计---入门_第6张图片

Java高并发程序设计---入门_第7张图片 

无锁(Lock-Free)

             – 首先是无障碍的
             – 保证有一个线程可以胜出

Java高并发程序设计---入门_第8张图片

无等待(Wait-Free)

            – 无锁的
            – 要求所有的线程都必须在有限步内完成
            – 无饥饿的

Java高并发程序设计---入门_第9张图片

你可能感兴趣的:(Java并发编程)