【发布时间】:2021-09-19 12:46:02
【问题描述】:
假设我有这个方法
/*1*/ public synchronized void method1() throws InterruptedException {
while (condition)
/*2*/ wait();
/*3*/ notify();
}
假设,我们在第 2 行有一个 Thread 1 等待条件,所以线程 1 将处于状态 WAITING。
现在Thread 2进入,它不满足条件,所以它绕过while循环然后Thread 2在第3行调用notify,然后Thread 1应该将其状态从WAITING更改为@ 987654329@,直到Thread 2 完全退出。
现在假设,在线程 2 完全退出之前,Thread 3 是同步块之外的BLOCKED 以获取监视器。
Thread 3 是否有可能在 Thread 1 之前获得锁? Thread 4、Thread 5等可以一样吗?在这种情况下,Thread-1 将处于饥饿状态。
这在概念上可行吗?
编辑:如果是这种情况,我该如何防止饥饿?
【问题讨论】:
-
简短回答:是的。你想用这个结构来达到什么目的?
-
嗯,没有足够的信息来给出一个可靠的建议。我们需要更多地了解
condition以及您实际尝试做的事情。也许它更容易和线程安全(er)完全不同?但要说出来,我需要知道“它”是什么。 -
@user16320675 或者最好颠倒逻辑。 thread 根本不应该等待。如果任何 data 还没有准备好被处理,那么它不应该被处理并放回某种队列......但是如果这适用于问题 OP 是完全未知的试图解决。
-
@user16320675 没错。而且你的猜测没有错。但我们所能做的就是“猜测”,直到 OP 澄清......
-
抱歉有歧义!我想这会回答我的问题。我只是想知道是否有任何方法可以让第一个进入阻塞状态的线程获得最高优先级。我想,在这种情况下,具有公平性的可重入锁会起作用。
标签: java multithreading wait synchronized