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的个数
浙公网安备 33010602011771号