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

java多线程与高并发的快速入门指南

2016-11-08 14:56 471 查看

并行世界的入门指南

并行计算主要适用于:图像处理+服务端编程(主要是java)。
性能翻倍的摩尔定律失效,软件开发为硬件设计者的无计可施所采取的多核cpu策略埋单。
同步/异步:同步需要等待调用结束才可以执行下一步,异步无需等待,类似消息,发出去了就去干别的事情了。
并发/并行:并发偏重多任务交替执行,并行是真正意义上的同时执行(必须多核CPU,因为一个CPU一次只能执行一条指令,操作系统只能不停的切换任务来并发)。
临界区:公共资源和共享数据,不可以被多线程同时占用。
阻塞和非阻塞:阻塞是线程因等待资源而挂起。非阻塞反之。
死锁、饥饿、活锁:多线程的活跃性问题。死锁是都占着资源死不撒手(最糟糕),饥渴是弱肉强食的不同优先级,活锁是都冲突时都谦让导致谁都拿不到。
并发级别:阻塞(synchronized/重入锁),无饥饿(公平和非公平锁),无障碍(最弱,冲突则回滚,实现策略是“一致性标记”),无锁(至少一个线程会ok,可能会出现类似饥饿的无穷循环),无等待(所有的线程都在有限步内完成,对循环次数的不同分为有界无等待和线程数无关的无等待;典型的例子有RCU,即Read-Copy-Update)。
并行的两个定律:加速比Amdahl、加速比Guwtafson。

加速比Amdahl = 优化前系统耗时/优化后系统耗时 = 1/(串行的比例+(1-串行的比例)/处理器的个数)

加速比Guwtafson=优化前系统耗时/优化后系统耗时=处理器个数-串行比例*(处理器个数-1)
JMM(java的内存模型)的关键技术都是围绕多线程的原子性、可见性和有序性来建立的。
指令不能重排的Happen-Before规则,都是为了不破坏原有的语义结构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: