线程饥饿

时间:2010-08-05 07:08:20

标签: java multithreading

如果我有一个大数组(400000 elems),一个具有最高优先级的线程和一个同步读取方法 如果这个线程访问它而不是长时间将对象释​​放到具有低优先级的其他线程,那么我们可以像STARVATION那样说话吗?

或者饥饿是一个术语,只涉及线程无限期推迟释放其对象锁定的情况?

4 个答案:

答案 0 :(得分:2)

Starvation是指Java运行时(JVM)没有为要执行的线程分配时间。这可能是由于一个糟糕的调度算法(如Solaris下的绿色线程,其中1到100万的for循环执行CPU密集型操作不会在Solaris下产生CPU,但会在Windows下),编程实践不佳(不是从applet中的paint()方法,或者是恶意攻击(比如在CPU进程超出Java进程的情况下命中拒绝服务攻击的主机)。

参考链接:http://www.jguru.com/faq/view.jsp?EID=47379

答案 1 :(得分:1)

“Starve”可以有很多含义。在您的情况下,您的线程可能会缺乏CPU时间分配,就像其他人已经注意到的那样。此外,可以说你的线程缺乏工作。

如果出于某种原因,一个线程正在锁定资源并且从不释放它,则会出现死锁。还有一个名为“线程饥饿死锁”的术语。在这种情况下,系统变为死锁,因为没有足够的线程(更正式地说,如果您使用有界线程池来执行相互依赖的任务,则会发生这种情况)。

更一般地说,可能存在资源饥饿死锁,如果您只有固定数量的资源来同时执行相互依赖的任务,则可能会发生死锁。

总之,“饥饿”是一个超载的术语,可能意味着许多事情......

答案 2 :(得分:0)

如果您询问当优先级较低的线程无法获取锁定时是否发生饥饿,因为调度程序选择了优先级较高的线程,则为是。

答案 3 :(得分:0)

在您的情况下,一个线程在处理数据时保持锁定。当Thread保持锁定时,没有其他Thread可以开始工作。 在这种情况下,它不是线程饥饿。其他线程无法开始工作,因为你的应用程序明确告诉他们等待锁定可用,这与饥饿无关,而是与你的实现有关。