并发线程的一些基础概念(自学笔记)

本人的一些学习笔记,与各位分享,有错误欢迎指正。
1.同步与异步:
(1)同步:必须等到被调用方法返回之后才能继续下面的内容
(2)异步:被调用方法会立即返回,不阻碍调用方法的内容执行,被调用的方法会另启一个线程执行改方法内容。

2.并发与并行:
(1)并发:偏向于多个任务交替进行,类似单核CPU同时执行多个任务
(2)并行:偏向于任务同时进行,类似于多核CPU分别同时执行多个任务
(3)由于现在的CPU性能强大,从结果来看,大部分情况下其实效果差别不大

3.临界区
(1)表示一种公共资源或者是共享数据,可以被多个线程使用。
(2)同时只有一个线程可以使用临界区的某一资源
(3)并行的程序中,如果同时获得临界区数据并处理,会导致结果与预期大相径庭

4.阻塞与非阻塞
(1)阻塞:一个线程占用某一临界区资源未释放,后面的线程请求该资源无法获得,导致后面的线程一直处于等待挂起。
(2)非阻塞:顾名思义就是没有一个线程可以妨碍其它线程的执行,所有线程都会不断尝试向前执行。

5.死锁(Deadlock),饥饿(Starvation)和活锁(Livelock)
(1)死锁:多个线程互相占用资源不肯释放,导致线程进入无休止的等待中,为最严重的情况。
(2)饥饿:某一个或者多个线程迟迟无法获得所需资源,导致一直无法执行。例如:某些低优先级的线程在非公平锁的机制下,高优先级线程不断的疯狂请求,并插队执行,导致低优先级的线程进入无休止的等待中,直至挂起。
(3)活锁:两个线程之间占用同一资源,并且互相来回谦让,导致2个线程均无法正常执行

6.并发级别
(1)阻塞:一个线程是阻塞的,其它线程释放资源前无法继续执行。
(2)无饥饿:不区分线程优先级,按照先来后到的顺序执行,不会产生饥饿。
(3)无障碍:无障碍是一种最弱的非阻塞调度。多个线程可以同时访问同一个临界区资源,通过检测数据是否被修改保证执行的数据是正确的,检测到非正常数据会进行回滚处理,但是存在风险,存在严重冲突时,所有线程都会不断回滚自己的操作,导致没有一个线程能够走出临界区。
(4)无锁:无锁的并行都是无障碍的,但是无锁的并发保证必然有一个线程能在有限步内完成操作离开临界区。
(5)无等待:无等待比无锁更进一步,所有的线程必须在有限步内完成,这样就不会产生饥饿的问题。典型的无等待结构是RCU(Read Copy Update),对于读不加控制,所有的读线程都是无等待的。但是写操作时,先取的原始数据的副本,接着修改副本数据,修改完成后,在合适的时机回写数据。

7.两个有关并行的重要定律
(1)加速比:加速比 = 优化前系统耗时 / 优化后系统耗时
(2)Amdahl定律:当串行化比例一定时,加速比是有上限的,不管堆叠多少个CPU参与计算,都不能突破这个上限。
(3)Gustafson定律:如果可被并行化的代码占比足够大,那么加速比就能随着CPU的数量线性增长

8.JMM(Java内存模型,Java Memory Model),三大特性
(1)原子性:是指一个操作是不能被中断的。即使在多个线程一起执行时,一个操作一旦开始就不会被其它线程干扰
(2)可见性:当一个线程修改某个共享变量的值时,其它线程应该能够立即知道这个修改。
(3)有序性:有序性并不是表示代码一定是按照代码顺序从前到后执行,而是满足happens-before的规则下允许编译器和处理器对代码进行指令排序,单线程下保证代码语义串行性。

9.Happens-Before规则
(1)程序顺序原则:一个线程内保证语义的串行性
(2)Volatile规则:volatile变量的写先于读发生,这保证了volatile变量的可见性
(3)锁规则:解锁必然发生在随后的加锁前
(4)传递性:A先于B,B先于C,那么A必然先于C
(5)线程的start()方法先于它的每一个动作
(6)线程的所有操作先于线程的终结(Thread.join())
(7)线程的中断(interrupt())先于被中断线程的代码
(8)对象的构造函数的执行,结束先于finalize()方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值