线程饥饿死锁

梦里梦外; 2023-03-04 06:59 27阅读 0赞

文章目录

        • 一、什么是死锁:
          • 1.2 死锁的四个必要条件
        • 二、线程饥饿死锁
        • 三、小结

目录

一、什么是死锁:

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

1.2 死锁的四个必要条件

1⃣️:请求和保持请求:当进程因请求资源而阻塞时,对已获得的资源保持不放
2⃣️:不可剥夺:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
3⃣️:循环等待:在发生死锁时,必然存在一个进程–资源的环形链。
4⃣️:互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用

二、线程饥饿死锁

在线程池当中如果任务依赖其他任务,那么就有可能发生死锁,例如在单线程单Executor中如果一个任务中又提交了另外一个任务。并且还在等待该任务的提交结果,那么通常会发生死锁。如果在一个更大的线程池当中,如果所以正在执行的线程都由于等待其他处于工作队列中的任务而阻塞,这种现象就被称为线程解饿死锁这种情况就出现了死锁的必要条件。因为线程池中的任务需要无限期地一些必须由池中其他任务才能提供的资源或条件。

在这里插入图片描述
我们利用单线程池SingleThreadExecutor 很容易复现这个场景。

  1. /** * @author liuzihao * @create 2020-08-02-10:54 */
  2. public class DeadLock {
  3. public static void main(String[] args) {
  4. ExecutorService executorService = Executors.newSingleThreadExecutor();
  5. // 任务A
  6. executorService.submit(()->{
  7. // 任务B
  8. Future<String> submit = executorService.submit(() -> {
  9. return " one things";
  10. });
  11. return submit.get();
  12. });
  13. // 如果是线程数量小 该线程会被饥饿
  14. executorService.execute(()->{
  15. System.out.println("其他任务");
  16. });
  17. }
  18. }

三、小结

在使用多线程如果存在任务依赖,就要注意死锁多发生了,然后就可能出现线程饥饿,因此需要在代码配置多时候注意线程池的大小。

发表评论

表情:
评论列表 (有 0 条评论,27人围观)

还没有评论,来说两句吧...

相关阅读

    相关 、活饥饿

    死锁 死锁是多线程编程中一种常见的问题,它发生在两个或多个线程相互等待对方释放资源的情况下。这种情况会导致所有线程都无法继续执行,程序停滞不前。典型的死锁情况包括以下几个