【并发】基本概念

参考书籍

参考书籍:《Java高并发程序设计》、《Java核心技术卷I》

概念

进程&线程

进程:程序的一次执行过程,是系统运行程序的基本单位。

线程:比进程更小的执行单位。一个进程在执行的过程中可以产生多个线程。同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟栈和本地方法栈。

线程

在这里插入图片描述

  1. 新创建栈:new Thread()

  2. 可运行线程:调用start()方法,线程处于runnable状态。可运行的线程可能正在运行也可能没有运行,这取决于操作系统给线程提供运行的时间。

  3. 被阻塞/等待:暂时不活动,不运行任何代码且消耗最少资源,直到线程调度器重新激活它。

    • 阻塞:线程试图获取一个内部的对象锁,而该锁被其他线程持有。当该锁被释放且该线程允许持有他,则阻塞变为非阻塞。
    • 等待:线程等待另一个线程通知调度器一个条件时,进入等待状态。Object.wait或Thread.join方法活着使用java.util.concurrent库中的Lock或Condition时可能会出现此类状况
    • 计时等待:有几个方法有一个超时参数,调用它们导致线程进入计时等待状态。一直保持到超时期满或者接收到适当的通知。带有超时参数的方法有:Thread.sleep,Object.wait,Thread.join,Lock.tryLock,Condition.await。
      在这里插入图片描述

    关于线程+Java的更多信息,会新开一篇博客记录。

同步&异步

同步和异步用来形容一次方法的调用。

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

异步:调用方法开始,立即返回,调用者可继续后面操作,调用方法开辟新线程执行,方法结束后通知调用者接收返回。

在这里插入图片描述

并发&并行

都可以表示两个或多个任务一起执行,但侧重点不同。

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

并行:真正意义上的同时执行

在这里插入图片描述

一个CPU使用多进程、多线程任务。一般是并发的。

多个CPU可实现并行操作。

临界区

用来表示一种公共资源、共享数据,可被多个线程使用。但每一次只能被一个线程使用,一旦资源被占用,其他线程必须等待。

临界区是被保护的对象,这就涉及到加锁、解锁等任务来保护临界区啦。

阻塞Blocking&非阻塞Non-Blocking

阻塞和非阻塞是用来形容多线程间的相互影响的。

阻塞:临界区资源被一个线程占用,其他线程则需要等待,线程挂起,这种情况就是阻塞。如果占用资源的线程一直不释放资源,那阻塞在此的线程都不能工作。

非阻塞:强调-没有一个线程能妨碍其他线程执行,所以线程都会尝试不断前向执行。

死锁DeadLock&饥饿Starvation&活锁LiveLock

死锁、饥饿、活锁都属于多线程的活跃性问题。如果发生上三种情况,多线程可能不再活跃,很难往下执行。

死锁

死锁:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源的释放。线程被无限期阻塞,程序不能正常终止。

产生死锁的四个必要条件
  1. 互斥条件:资源任意时刻只能被一个线程占用。
  2. 请求与保持条件:一个进程请求资源被阻塞,但其对已获得的资源保持不放。(这里为什么是进程而不是线程?
  3. 不剥夺条件:线程已获得的资源不能被强行剥夺,除非是自己使用完毕自主释放。
  4. 循环等待条件:等待资源的进程形成一种头尾相接的关系。
线程死锁的避免

破坏掉四个必要条件其中一个就行。

  1. 破坏互斥:因为临界区是互斥访问,锁就是用来互斥的,所以没办法破坏。
  2. 破坏请求与保持条件:在最开始就一次性申请完所有资源。
  3. 破坏不剥夺条件:如果申请其他资源申请不到,可以主动释放占有资源。
  4. 破坏循等条件:按序申请来预防。按某一顺序申请资源,释放资源则反序释放。

饥饿

饥饿:指线程无法获得需要的资源,导致一直无法执行。

可能发生原因:

  1. 优先级太低,高优先级不断抢占资源
  2. 某个线程一站占用资源不释放。

与死锁相比,饥饿还可能是在未来一段时间内可以解决。

活锁

活锁:秉承”谦让“原则的两个线程,主动将资源释放给对方,那么资源会在两者之间跳动,而没有一个线程可以拿到资源。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值