高并发-基本知识
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Non-Blocking 的意思与之相反,强调没有一个线程可以妨碍其它线程执行。所有
的线程都会尝试不断rvation And Livelock都属于多线程的活跃性问题。 死锁 Deadlock Deadlock是最糟糕的情况,这个状态将永远维护下去,避免出现此情况。 饥饿 Starvation Starvation是指一个或者多个线程因为种种原因无法获得所需要的资源,导致一直
阻塞和非阻塞
Blocking 和 Non-Blocking通常用来形容多线程间的相互影响 。 阻塞 Blocking Blocking 指一个线程占用了Critical zone资源,其它所有需要这个资源的线程就必 须在这个Critical zone中进行等待,等待会导致线程挂起,这就是阻塞。 非阻塞 Non-Blocking
指令不可重排:Happen-Before规则
程序顺序原则:一个线程内保证语义的串行性 volatile规则:volatile变量的写,先发生于读,这保证volatile变量的可见性 锁规则:unlock必然发生在随后的lock前
传递性:A先于B,B先于C,那么A必然先于C
线程的start()方法先于它的每一个动作 线程的所有操作行于线程的终结(Thread.join()) 线程的中断(interrupt())先于被中断线程的代码 对象的构造函数执行、结束先于finalize()方法
并发和并行
并发 Concurrency
Concurrency偏重于多个任务交替执行,而多 个任务之前有可能还是串行的
并行 Parallelism Parallelism是真正意义上的“同时执行”.
要求:必须拥有多个CPU的系统中
临界区
临界区 Critical zone Critical zone 用来表示一种公共资源或者说共享数据,可以被多个线程使用,但是 每一次,只能有一个线程使用它,一旦临界区资源被占用,其它线程要想使用这个资源, 就必须等待。 在并行程序中,Critical zone资源是保护的对象,必须只能一个线程使用,否则就 是损坏的。
Deadlock、Starvation And Livelock
Concurrency Level 并行的两个重要定律
Amdahl Gustfson
JMM
Atomicity Visiblity
Ordering
同步和异步
同步Synchronous Synchronous 调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。 java中使用 synchronzied 异步Asynchronous Asynchronous 方法调用更像一个消息传递,一旦开始,方法调用就会立即返回 ,调 用者就可以继续后续的操作。而异步方法通常会在另一个线程中“真实”地执行。
并行的两大定律
Amdahl 安达尔
Amdahl定律定义了串行系统并行化后的加速比的计算公式和理论上限。 加速比=优化前系统耗时/优化后系统耗时 加速比越高,优化效果越明显。 根据Amdahl定律,使用多核CPU对系统优化,优化效果取决于CPU数量以及系统中串行 化程序的比重,CPU数量越多,串行化比重越低,则优化效果越好。仅提交 CPU数据而不降 低程序的串行化比重,也无法提高系统性能 。 Gustafson 古斯塔夫森 Gustafson也说明处理器个数,串行比例和加速比之间关系 。如串行比例越小,并行比越大, 加速比就是处理器个数。即只要不断累加处理器,就能获得更快的速度 。 两个定律并不矛盾,如果系统中没有可被串行化的代码(F=1),那么两个定律加速比都是1.反 之 ,如果系统中可串行化代码比重达到100%,那么这个定律得到加速比都是n(处理器个数)。
无法执行。原因:线程优先级可能太低。
活锁 Livelock Livelock是一种非常有趣的,因为线程间相互谦让导致谁都无法使用Critical zone 资源 ,都是不幸的。
并发级别 Concurrency Level
由于Critical zone的存在,多线程之间的并发必须受到控制,大致分类阻塞、无饥饿、无障碍、无锁和无等待。 阻塞 Blocking 一个线程是阻塞的,那么在其它线程释放资源之前,当前线程无法继续执行。无论是Synchronzied或者重入锁时,得到的就是阻塞 的线程。 无饥饿 Starvation-Free 如果线程之间是有优先级的,那么线程调度的时候总会倾向满足高优先级的线程。分配 是不公平的。如果没有优先级就不会产生饥 饿 无障碍 Obstruction-Free Obstruction-Free是一种最弱的Non-Blocking调度。阻塞的控制方式是悲观策略,无障碍是乐观策略,一旦检测到冲突就进行回 滚。通过“一致性标记”来实现。 无锁 Lock-Free Lock-Free的并行是Obstruction-Free,在无锁的情况下,所有的线程都能尝试对Critical zone进行访问,但无锁的并发保证必然有 一个线程能够在有限步内完成操作离开Critical zone.如总是尝试不成功,会出现饥饿的现象 。 无等待 Wait-Free Lock-Free只要求 一个线程可以在有限步内完成操作,而Wait-Free则在无锁的基础上更进一步进行扩展。要求所有线程都在有限 步内完成,不会引起饥饿问题。RCU(Read Copy Update),所有读都是无等待的。
高并发程序-基本概念
Zheng.0812@
2017-2-12
Catalog
Base consept
Synchronous And Asynchronous Concurrency And Parallelism Critical zone
Blocking And Non-Blocking
JMM- Java Memory Model
JMM的关键技术点就是围绕着多线程的原子性、可见性和有序性来建立的。 原子性 Atomicity Atomicity是指一个操作是不可中断的。即在多个线程一起执行时,一个操作一旦开始, 就不会被其它线程干扰。 可见性 Visibility Visibility是指一个线程修改了某一个共享变量的值,其它线程是否能够立即知道这个修改。 有序性 Ordering Ordering可能是三个问题中最难理解的。对于一个线程的执行代码而言,习惯地认为代码 的执行是从先往后,依次执行的,而并发就可能会出现乱序,原因是可能会进行指令重排。 指令重排可以保证串行语义一致,但是没有义务保证多线程间的语义一致。