您的位置:首页 > 编程语言 > Java开发

实战java高并发程序设计第一章读书笔记

2017-04-17 21:28 183 查看

走入并发世界

1.2 并发基本概念

1)同步和异步

同步和异步一般形容方法调用,同步必须等到方法调用结束才能继续后续行为;而异步更像是消息传递,可以立刻返回

2)并发和并行

并发是伪并行,在一个时刻只有一个任务在运行;而并行在一个时刻可以同时执行多个任务

3)临界区

这个是操作系统里的概念,指的是一种共享资源或者是共享数据,可以被多个线程使用,但每一次都只有一个线程可以占用

4)阻塞和非阻塞

阻塞和非阻塞一般用在多个线程之间的关系,阻塞指的是一个线程占用临界区资源时其他线程都必须等待;而非阻塞则表示其他线程不用等待

5)死锁,饥饿和活锁

死锁定义

这三种都属于多线程的活跃问题,死锁最为严重,所有的线程都被阻塞,无法推进;而饥饿和活锁一般都指针对一个或者多个线程,饥饿指的是线程(一个或者多个)一直无法执行,例如该线程优先级太低,一直被高优先级线程抢占资源;而活锁指的是两个线程都在主动释放资源,但是没有一个线程可以拿到所有资源而正常执行。

1.3 并发级别

1)阻塞

这种情况得不到锁的线程会被挂起等待

2)无饥饿

可以理解为公平锁,不允许高优先级的线程插队,所有线程都有机会执行

3)无障碍

各个线程无障碍的执行,一旦检测到冲突就进行回滚,不能保证顺畅运行

4)无锁

无锁的并行必定是无障碍的,但是无锁并发保证必有一个线程可以在有限步内完成操作离开临界区,可能出现饥饿

5)无等待

无等待在无锁的基础上,要求所有线程都必须在有限步内完成;典型结构RCU(Read-Copy-Update)。对于数据的读不加控制,所有读都是无等待;对于写,先取原始数据的副本,只修改副本,完成后在合适时机回写数据

1.4 有关并行的两个重要定律

1)Amdahl定律

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

T(n)=1/(F+1/n∗(1−F))

n表示处理器个数,F表示串行比例

2)Gustafson定律

F = a / ( a + b )

S(n)=n−F∗(n−1)

a表示串行时间,b表示并行时间,F表示串行比例

Amdahl强调: 当串行比例一定时,加速比是有上限的。

Gustafson强调: 如果并行化的代码所占比重足够多,加速比就能随着cpu的数量线性增长

1.5 JMM

1)原子性

原子性指的是一个操作不可被中断,一个操作一旦开始,就不会被其他线程中断

2)可见性

可见性是指一个线程修改某一个共享变量的值,其他线程能否立刻知道这个修改。缓存优化,硬件优化,指令重排或者编辑器优化都可能导致一个线程的修改不会立即被其他线程察觉。

3)有序性

指令重排可以保证串行语义一致,但是无法保证多线程间语义一致。

指令重排是为了减少中断流水线,提升性能

4)Happen-Before

禁止指令重排的一些基本规则:

1.一个线程内保证语义串行性

2.volatile变量的写先于读,保证volatile变量的可见性

3.unlock必须发生在下一个lock之前

4.传递性: A先于B, B先于C, 则A必然先于C

5.线程的start()方法先于它的每一个动作

6.线程的所有操作先于线程的终结(Thread.join())

7.线程的中断(interrupt())先于被中断的代码

8.对象的构造函数的执行结束先于finalize()方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: