Java高并发程序设计(一)-前言

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

需要并行的原因和说法:
Linus Torvalds :并行计算只有在图像处理和服务端编程2个领域可以使用,并且它在这2个
领域确实有着大量广泛的使用。但是在其它任何地方,并行计算毫无建树! 

摩尔定律的失效
– 预计18个月会将芯片的性能提高一倍
– Intel CEO Barret单膝下跪对取消4GHz感到抱歉
• 在2004年秋季,Intel宣布彻底取消4GHz计划
– 虽然现在已经有了4GHZ的芯片,但频率极限已经逼近 

顶级计算机科学家唐纳德·尔文·克努斯
– 在我看来,这种现象(并发)或多或少是由于硬件设计者
– 已经无计可施了导致的,他们将摩尔定律失效的责任
– 推脱给软件开发者。

二,几个重要的概念
同步(synchronous)和异步(asynchronous)


并发(Concurrency)和并行(Parallelism)


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


阻塞(Blocking)和非阻塞(Non-Blocking)
阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要
这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。此时,如
果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。
– 非阻塞允许多个线程同时进入临界区

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

锁:如A,B,C,D四辆车,每辆车都占用一条道路的资源,互相等待其它车辆释放资源,形成死锁。
活锁:如电梯遇人,A要从电梯出去,B要进来电梯,两人相互阻挡,并且同时在左右避让时(释放资源),又阻挡到对方。

并行的级别

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

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

无锁(Lock-Free)
– 是无障碍的
– 保证有一个线程可以胜出
while (!atomicVar.compareAndSet(localVar, localVar+1))
{
localVar = atomicVar.get();
}

无等待(Wait-Free)
– 无锁的
– 要求所有的线程都必须在有限步内完成
– 无饥饿的 

三,有关并行的两个重要定律


猜你喜欢

转载自blog.csdn.net/hhq12/article/details/80851531