1. 前言
这部分主要记录几个概念.
2. 临界区
临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用.但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程想要使用这个资源,就必须等待. 比如打印机.
在并行程序中,临界区资源是保护的对象.
3. 阻塞和非阻塞
阻塞(Blocking)
非阻塞(Non-Blocking)
阻塞和非阻塞通常用来形容多线程间的相互影响.比如一个线程占用了临界区资源,那么其他所有需要这个资源的线程就必须在这个临界区中进行等待.等待会导致线程挂起,这种情况就是阻塞.此时,如果占用资源的线程一直不愿意释放资源,那么其他所有阻塞在这个临界区上的线程都不能工作.
非阻塞的意思与之相反,它强调没有一个线程可以妨碍其他线程执行.所有的线程都会尝试不断前向执行.
4. 死锁,饥饿和活锁
死锁(Deadlock)
饥饿(Starvation)
活锁(Livelock)
都属于多线程的活跃性问题.如果发生上述情况,那么相关线程可能不再活跃.
死锁:彼此占有对方需要的资源,都不释放;
饥饿:线程因种种原因无法获取所需资源,一直无法执行(比如线程优先级可能太低,而高优先级的线程不断抢占它需要的资源,导致低优先级线程无法工作.再比如某一个线程一直占着关键资源不放,导致其他需要这个资源的线程无法正常执行);
活锁:彼此占有对方需要的资源,都主动释放,但是没有一个线程同时拿到所有资源而正常执行,出现资源不断在两个线程之间跳动.
5. 两个重要定律
5.1 Amdahl定律(阿姆达尔定律)
阿姆达尔定律是计算机并行重要的定律. 定义了串行系统并行化后的加速比的计算公式和理论上限.
加速比 = 优化之前系统耗时 / 优化后系统耗时
假设有n个处理器,t1表示优化前耗时,tn表示经过n个处理器优化后的耗时,f是程序中只能串行执行的比例.
我们可以分析出, 串行比例越低且处理器越多,加速比越高,程序优化效率越高.
如果串行比例占2/3,则无论处理器再多,最大加速比也只能达到1.5.理想效果是,全部并行,最大加速比为 n.可以根据增加处理器无上限增强程序效率.
5.2 Gustafson定律(古斯塔夫森定律)
古斯塔夫森定律也是在表明处理器个数,并行比例和加速比之间的关系.
执行时间: 串行时间a + 并行时间b
优化后时间: a + nb
加速比: (a + nb) / (a + b)
f串行比例 : a / (a + b)
6. JMM
Java内存模型(JMM)
6.1 原子性(Atomicity)
原子性是指一个操作是不可中断的.即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰.
6.2 可见性(Visibility)
可见性是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改.
6.3 有序性(Ordering)
指令重排保证串行语义一致,但无法保证多线程间语义一致.
指令重排是出于性能考虑(流水线技术).
7. 参考文献
<< Java高并发程序设计 >>(葛一鸣 郭超)