Java - 等待后的执行顺序

Java - order of execution after wait

全部。我对 Java 等待通知机制有疑问。答案是是否保证线程将按此顺序执行 - 从最后一个到第一个等等。结果总是 100, 99, ... , 1 ?这是代码片段:

public class 主 {

static int counter = 0;
static Object o = new Object();

public static void main(String[] args){

    for(int i = 0; i < 100; ++i){
        new Thread(() -> {
            synchronized (o) {
                try {
                    int c = ++counter;
                    o.wait();
                    System.out.println("" + c);
                    Thread.sleep(100);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    synchronized (o) {
        new Thread(()-> {
            synchronized(o){
                System.out.println("LAsttttttttttttttttt");
            }
        }).start();


        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        o.notifyAll();
    }

}

}

我运行重复了10次,结果都是一样的。我在互联网上找不到任何相关信息。还有一个问题——当我们有 100 个线程在等待时,当我们 notifyAll 时,是否保证第一个等待线程将被执行,然后是第二个,并且在所有 100 个等待线程都被执行之后,其他等待方法(这是在同步块中,但在它们的主体中没有 wait()),将在之后执行(在执行完所有 100 个等待的线程之后)。或者 notifyAll 只保证所有等待的线程将开始与这个对象同步的每个方法战斗?我认为这是答案: “被唤醒的线程将无法继续,直到当前 * 线程放弃对该对象的锁定。觉醒的线程 * 将以通常的方式与任何其他线程竞争 * 积极竞争同步这个对象;例如, * 被唤醒的线程在以下方面没有可靠的特权或劣势 * 是下一个锁定此对象的线程。"

但我想确保我了解等待通知时发生的情况。 提前致谢。

没有。 .不保证一组唤醒的线程将以任何特定顺序执行。 (由于 JVM 的特定实现或程序 运行 所在的计算机的速度,或许多其他基于负载的变量,这可能会按顺序发生。但是,没有语言保证。)

Java的synchronized代码块不保证等待进入synchronized块的线程进入的先后顺序,notifyAll()也不是特例.

正如您在 notifyAll() javadoc 中看到的(强调我的):

The awakened threads will not be able to proceed until the current thread relinquishes the lock on this object. The awakened threads will compete in the usual manner with any other threads that might be actively competing to synchronize on this object; for example, the awakened threads enjoy no reliable privilege or disadvantage in being the next thread to lock this object.