首页 > 编程笔记 > Java笔记 阅读:19

什么是线程饥饿,和死锁有什么区别?(新手必看)

饥饿和死锁是并发编程中常见的问题,可以导致系统效率降低,但它们有各自的特点。

饥饿发生在低优先级线程请求系统资源,但由于高优先级线程长时间占用该资源,导致低优先级线程无法运行的情况下。当一个线程准备开始执行时,它等待 CPU 分配所需资源。但是,由于其他线程阻塞所需的资源,该线程必须无限期地等待。

在大多数优先级调度策略中会出现饥饿问题。在优先级调度中,资源通常分配给优先级较高的线程,这有助于防止较低优先级的线程获取请求的资源。

饥饿是一个可以通过老化来解决的问题。老化可以提高等待资源时间较长的线程的优先级,还有助于防止低优先级线程无限期地等待资源。

以下是发生饥饿的一些原因:
在系统中我们可以使用下面一些方法避免和解决饥饿问题:
死锁和饥饿之间的区别有很多个方面,详情如下表所示:

特性 死锁 饥饿
基本定义 当某个线程持有某些资源同时等待其他资源,而它等待的资源被其他线程占有时会产生死锁。如果没有外部干预,这些线程处于阻塞状态 在低优先级线程请求系统资源,但由于高优先级线程长时间占用该资源,导致低优先级线程无法运行的情况下,就会发生饥饿
线程状态 线程处于阻塞状态,没有任何进展 单个或多个线程可能无法进行必要的操作,但系统中的其他线程可能正常运行
资源使用 线程不释放已占用的资源,其他线程会阻塞请求的资源 高优先级线程继续使用请求的资源
持续性 通常涉及多个资源,线程之间存在循环等待 可能只涉及单个资源,高优先级线程不断地获取该资源而导致低优先级线程无法执行
解决策略 死锁通常需要外部干预来解决,比如中断或杀死线程 通常通过调整优先级、确保公平的资源分配或者使用FIFO等调度策略来解决

相关文章