Java 线程饥饿

Java 线程饥饿,java,multithreading,Java,Multithreading,如果我有一个大数组(400000个元素),一个具有最高优先级的线程和一个同步读取方法 如果这个线程访问它,并且在很长一段时间内不将对象释放给其他优先级较低的线程,那么我们可以称之为饥饿吗 或者饥饿是一个术语,只涉及线程无限期推迟释放其对象锁的情况?饥饿是指Java运行时(JVM)没有为线程分配执行时间。这可能是由于调度算法不好(比如Solaris下的绿色线程,其中从100万到100万的for循环做一些CPU密集型的事情在Solaris下不会产生CPU,但在Windows下会产生CPU)、编程实践

如果我有一个大数组(400000个元素),一个具有最高优先级的线程和一个同步读取方法 如果这个线程访问它,并且在很长一段时间内不将对象释放给其他优先级较低的线程,那么我们可以称之为饥饿吗


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

饥饿是指Java运行时(JVM)没有为线程分配执行时间。这可能是由于调度算法不好(比如Solaris下的绿色线程,其中从100万到100万的for循环做一些CPU密集型的事情在Solaris下不会产生CPU,但在Windows下会产生CPU)、编程实践不好(不是从小程序中的paint()方法返回)或恶意攻击(比如用拒绝服务攻击攻击主机,其中CPU在Java进程之外忙碌)


Ref link:

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

饥饿可以有很多含义。在您的情况下,您的线程可能会像其他人指出的那样缺少CPU时间分配。此外,可以说您的线程缺少工作

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

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


总之,“饥饿”是一个重载术语,可能意味着很多事情。

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

几乎是的,但更确切地说,我想知道如果锁被锁定一段时间,是否也会发生饥饿g一段时间,而不仅仅是无限期。