java并发学习(一)

并发与并行

并行是两个线程同时执行,即同一时刻有两个线程在执行;

并发是在一段时间内两个线程交替执行,即同一时刻只有一个线程在执行。

为什么需要并行?

1.摩尔定律失效,目前提升CPU的主频已达到瓶颈,因此这就导致CPU的核心数目会继续增加。顶级计算机科学家唐纳德·尔文·克努斯 曾说:“在我看来,这种现象(并发)或多或少是由于硬件设计者 – 已经无计可施了导致的,他们将摩尔定律失效的责任 – 推脱给软件开发者。 ”

2.当需要解决计算密集型任务时或IO密集型任务时(如图像处理和服务端编程),此时并行是十分重要的。

3.出于业务需求。并不是要提高效率,而是业务需要多个执行单元。比如HTTP服务器,为每一个Socket连接新建一个处理线程。

临界区

表示公共资源或共享数据,可以被多个线程访问,但每次只能有一个线程使用它,其它线程想使用必须等待。

阻塞

当一个线程占用了临界区资源,则其它所有需要这个资源的线程就必须在这个临界区中等待,等待会导致线程挂起。这种情况就是阻塞。

死锁

死锁就是两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。如线程1和线程2都需要资源A、B,当线程1获得资源A,线程2获得资源B时,此时线程1、2要执行下去就必须要等对方将资源A、B上的锁释放,此时两个线程就在永远互相等待,形成死锁。

活锁

活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试—失败—尝试—失败的过程。处于活锁的实体是在不断的改变状态,活锁有可能自行解开。如线程1和线程2都需要资源A、B,当线程1获得资源A,线程2获得资源B时,此时线程1、2要执行下去就必须要等对方将资源A、B上的锁释放,则此时线程1就会释放资源A的锁,线程2也会释放资源B上的锁,然后就有可能再次出现线程1、2分别得到资源A、B,然后就又重复上面的过程,但有可能某一次出现一个线程得到了A、B两个资源,此时活锁就被解开了。

饥饿

饥饿只某些线程由于优先级低或其它原因无法获得资源,导致无法执行。

非阻塞

非阻塞允许多个线程同时进入临界区

无障碍

 无障碍是一种最弱的非阻塞调度。此时线程可以自由出入临界区,当无竞争时,线程在有限步内可以完成操作,而当有竞争时,则要回滚数据。 

无锁

在无障碍的前提下,保证每次都有一个线程可以胜出。

无等待

在无锁的前提下,要求所有线程都必须在有限步内完成,且不能有饥饿现象。

Amdahl定律(阿姆达尔定律) 

定义了串行系统并行化后的加速比的计算公式和理论上限。

加速比定义:加速比=优化前系统耗时/优化后系统耗时。

加速比=1/(F+(1-F)/n)        --其中F表示串行比例,1-F表示并行比例,n表示CPU的个数

Gustafson定律(古斯塔夫森)

说明处理器个数,串行比例和加速比之间的关系 。

加速比=n-F*(n-1)       --其中F表示串行比例,n表示CPU的个数

posted @ 2017-07-30 23:32  grj0011  阅读(112)  评论(0)    收藏  举报