多线程相关概念

同步与异步

同步与异步通常用来形容一次方法调用

同步

同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为

异步

异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作

区别

同步方法就是必须是下一次事件必须要等待上一次事情结束才能开始自己的,就像是线下购买电视机,需要在店铺里面等待店家配货,配货之后然后商家跟着你一起回到家里。完成过一次线下电视机购买的过程就是类似同步方法之间的执行
异步方法就是当上一次事件开始执行的时候,下一次事件也可以进行执行,等待的时间相对同步方法更少。就像线上购买电视机,订购电视机订单之后,对你来说购物已经结束,只需要等待商家送货,而在商家送货的期间,你可以做自己的事情

并发和并行

并发和并行都可以标识两个或者多个任务一起执行,只是偏重点不一样

并发

并发偏重于多个任务交替执行,而多个任务之间可能还是串行的

并行

并行就是同时执行,多个任务同时执行

区别

并行的多个任务是真是的同时执行,而对于并发来说,这个过程只是交替的,一会运行任务A,一会运行任务B,系统会不停地在两者切换。但是由于执行的时间很短的情况,对于外部观察者来看,即使多个任务之间是串行的,也会造成多任务之间是并行执行的错觉

实际情况

  1. 当系统只有一个CPU的情况下,而使用多进程或者多线程任务,那么真实环境中这些任务不可能是真实并行的,因为一个CPU一次只能执行一个指令
  2. 当系统拥有多个CPU的情况下,真实的并行可能会出现

临界区

临界区是一个用来表示公共资源或者说是共享数据,可以被多个线程使用,但是每一次只有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待
在并行程序中,临界区资源是受保护的对象

阻塞和非阻塞

阻塞

当一个线程占用了临界区资源,那么其他需要这个资源的线程就必须在这个临界区中进行等待。等待的过程会导致线程挂起,这种情况就是阻塞。此时如果占用资源的线程一直不释放资源,那么其他所有阻塞在这个临界区的线程都不能工作

非阻塞

非阻塞强调没有一个线程可以妨碍其他线程执行,所有的线程都会不断向前执行

死锁

当线程T1持有锁S1而申请获得锁S2,线程T2拥有锁S2而申请获得锁2,因为默认情况下锁的申请都是阻塞的,所以就会造成T1和T2不断申请锁1和锁2,无法释放各自所拥有的锁,这样就会造成死锁
死锁是一个很严重的问题,也是最高的问题

饥饿

饥饿是指某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。比如

  1. 线程优先级过低的情况,高优先级的线程会不断的抢占资源,而低优先级的线程就会一直无法获取线程而导致线程饥饿
  2. 某一线程一直占着关键资源不放,导致其他需要这个资源的线程无法正常执行

活锁

当资源不断的在两个线程中跳动,而没有一个线程可以同时拿到所有资源而正常执行。就像平常生活中,经常会遇到两个人同时为对方让路,这就造成两个人的避让之后又碰上了,而如果程序碰上这种情况的时候,主动将资源释放给其他线程使用,就会造成多个线程都没有资源使用而造成活锁

并发级别

阻塞(Blocking)

一个线程是阻塞的,那么在其他线程支行资源之前,当前线程无法继续执行,而当使用synchronized关键字或者重入锁时,得到的就是阻塞的线程

无饥饿

如果线程之间有优先级,那么线程调度的时候总是会倾向于满足高优先级的线程,也就是对于资源的分配是不公平的
如果锁是公平的,满足先来后到,那么饥饿就不会产生的

无障碍

无障碍是一种最弱的非阻塞调度,如果两个线程都是无障碍的执行,那么就不会因为临界区的问题导致一方被挂起。但是当两个线程同时修改临界区数据,而造成数据错乱的问题,对于无障碍线程,一旦检测到这种情况,会立即对自己所做的修改进行回滚,确保数据安全,如果没有发生数据竞争,那么线程就可以顺利完成给自己的工作,走出临界区

无锁

无锁的并行并不是无障碍的,在无锁的情况下,所有的线程都能尝试对临界区进行访问,当不同的是,无锁的并发保证必然有一个线程能够在有限步内完成操作 离开临界区

无等待

无等待在无锁的基础上更进一步进行扩展,要求所有的线程都必须在有限步内完成,这样就不会产生饥饿问题。

参考数据

《Java高并发程序设计》-------------------------葛一鸣,郭超编著

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值