如果我有一个很大的数组(400000个元素),一个具有最高优先级的线程和一个同步读取方法,如果这个线程访问它,并且在很长一段时间内没有将对象释放给其他具有如此饥饿的低优先级线程,我们可以说它是饥饿吗?
或者饥饿只是一个术语,只涉及线程无限期推迟释放其对象的锁的情况?
发布于 2010-08-05 15:12:56
饥饿是指Java运行时(JVM)没有为线程分配执行时间。这可能是由于糟糕的调度算法(如Solaris下的绿色线程,在Solaris中,执行某个CPU密集型任务的for循环在Solaris中不会产生CPU,但在Windows中会产生CPU )、糟糕的编程实践(不从applet中的paint()方法返回)或恶意攻击(如对主机发起拒绝服务攻击,此时CPU正忙于Java进程之外)。
参考链接:http://www.jguru.com/faq/view.jsp?EID=47379
发布于 2010-08-05 15:32:01
“饥饿”有很多含义。在您的情况下,您的线程可能会像其他人所指出的那样,CPU时间分配不足。另外,也可以说你的线程缺乏工作。
如果由于某种原因,某个线程锁定了资源,并且从未释放它,则会出现死锁。还有一个术语叫做“线程饥饿死锁”。在这种情况下,系统变得死锁,因为没有足够的线程(更正式地说,如果您使用有界线程池来执行相互依赖的任务,就会发生这种情况)。
更普遍的情况是,可能会出现资源匮乏死锁,如果只有固定数量的资源可以并发执行相互依赖的任务,就会发生这种情况。
总而言之,“饥饿”是一个过载的术语,可以表示许多事情。
发布于 2010-08-05 15:13:26
如果你问,如果低优先级的线程由于调度程序选择了高优先级的线程而无法获得锁,是否会发生饥饿,那么答案是肯定的。
https://stackoverflow.com/questions/3412462
复制相似问题