Java并发之其他的活跃性危险(饥饿,活锁)
一.概述
除了死锁之外,在并发程序中还存在一些其他的活跃性危险,包括:饥饿,活锁等等。
下面我们分别了解和学习下。
二.具体学习
1.饥饿
当线程由于无法访问它所需要的资源而不能继续执行时,就会发生 “饥饿(Starvation)” .
1)引发饥饿的最常见资源就是CPU时钟周期。如果在java应用程序中对线程的优先级使用不当,或者在持有锁时执行一些无法结束的结构(例如无限循环或者无限制的等待某个资源),那么也可能导致饥饿,因为其他需要这个锁的线程将无法得到它。
2)在Thread API 中定义的线程优先级只是作为线程调度的参考。 在Thread API中定义了10个优先级,JVM根据需要将它们映射到操作系统的调度优先级,这种映射是特定平台相关的,因此在某个操作系统中两个不同的Java优先级可能被映射到同一个优先级,而在另一个操作系统中则可能被映射到另一个不同的优先级。
注意:在某些操作系统中,如果优先级的数量少于10个,那么有多个java优先级将被映射到同一个优先级。
3)操作系统的线程调度会尽力提供公平的,活跃性良好的调度方式,甚至超出了java语言规范的需求范围。 在绝大多数java应用程序中,所有线程都具有相同的优先级(Thread.NORM_PRIORITY)。
4)我们要知道线程优先级并不是一种直观的机制(我们很难在代码中明显看到) 而通过修改线程优先级所带来的效果通常也不明显。 当提

浙公网安备 33010602011771号