Loading

Java并发之其他的活跃性危险(饥饿,活锁)

一.概述

除了死锁之外,在并发程序中还存在一些其他的活跃性危险,包括:饥饿,活锁等等。
下面我们分别了解和学习下。

二.具体学习

1.饥饿
当线程由于无法访问它所需要的资源而不能继续执行时,就会发生 “饥饿(Starvation)” .

1)引发饥饿的最常见资源就是CPU时钟周期。如果在java应用程序中对线程的优先级使用不当,或者在持有锁时执行一些无法结束的结构(例如无限循环或者无限制的等待某个资源),那么也可能导致饥饿,因为其他需要这个锁的线程将无法得到它。

2)在Thread API 中定义的线程优先级只是作为线程调度的参考。 在Thread API中定义了10个优先级,JVM根据需要将它们映射到操作系统的调度优先级,这种映射是特定平台相关的,因此在某个操作系统中两个不同的Java优先级可能被映射到同一个优先级,而在另一个操作系统中则可能被映射到另一个不同的优先级。

注意:在某些操作系统中,如果优先级的数量少于10个,那么有多个java优先级将被映射到同一个优先级。

3)操作系统的线程调度会尽力提供公平的,活跃性良好的调度方式,甚至超出了java语言规范的需求范围。 在绝大多数java应用程序中,所有线程都具有相同的优先级(Thread.NORM_PRIORITY)。

4)我们要知道线程优先级并不是一种直观的机制(我们很难在代码中明显看到) 而通过修改线程优先级所带来的效果通常也不明显。 当提

posted @ 2020-12-06 14:39  文牧之  阅读(26)  评论(0)    收藏  举报  来源