线程饥饿死锁
文章目录
- 一、什么是死锁:
- 1.2 死锁的四个必要条件
- 二、线程饥饿死锁
- 三、小结
目录
一、什么是死锁:
死锁是指两个或两个以上的进程
在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法
推进下去。
1.2 死锁的四个必要条件
1⃣️:请求和保持请求:当进程因请求资源而阻塞时,对已获得的资源保持不放
2⃣️:不可剥夺:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
3⃣️:循环等待:在发生死锁时,必然存在一个进程–资源的环形链。
4⃣️:互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用
二、线程饥饿死锁
在线程池当中如果任务依赖其他任务,那么就有可能发生死锁,例如在单线程单Executor中如果一个任务中又提交了另外一个任务。并且还在等待该任务的提交结果,那么通常会发生死锁。如果在一个更大的线程池当中,如果所以正在执行的线程都由于等待其他处于工作队列中的任务而阻塞,这种现象就被称为线程解饿死锁
,这种情况就出现了死锁的必要条件。因为线程池中的任务需要无限期地一些必须由池中其他任务才能提供的资源或条件。
我们利用单线程池SingleThreadExecutor
很容易复现这个场景。
/** * @author liuzihao * @create 2020-08-02-10:54 */
public class DeadLock {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
// 任务A
executorService.submit(()->{
// 任务B
Future<String> submit = executorService.submit(() -> {
return " one things";
});
return submit.get();
});
// 如果是线程数量小 该线程会被饥饿
executorService.execute(()->{
System.out.println("其他任务");
});
}
}
三、小结
在使用多线程如果存在任务依赖,就要注意死锁多发生了,然后就可能出现线程饥饿,因此需要在代码配置多时候注意线程池的大小。
还没有评论,来说两句吧...