Java线程在notifyAll之后竞争

时间:2015-11-04 00:04:42

标签: java concurrency

我想知道在这种情况下会发生什么:我有10个线程等待(使用wait)某些lockObject和1个线程(让我们称之为X线程)试图进入由lockObject块同步。那么等待进入同步块的X线程最后会被执行吗?不要看文件来讲述这个问题。但实际上我试过这个并且X线程总是最后执行。我知道"在实践中"当我们谈论并发时,它不是一个证明,但仍然......我错过了什么或者? 提前谢谢。

P.S。 这是我的意思代码:

public class Main {
public static void main(String[] args) {

    final Object lock = new Object();

    for (int i = 0; i < 500; ++i) {
        Thread t = new Thread(() -> {
            String currentThreadName = Thread.currentThread().getName();
            try {

                synchronized (lock) {
                    System.out.println("Start waiting: " + currentThreadName);
                    lock.wait();
                    System.out.println("End of synchronized: " + currentThreadName);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("Thead enddds: " + currentThreadName);

        });

        t.setName("Thread: " + i);
        t.start();
    }

    try {
        Thread.sleep(1000);
        synchronized (lock) {

            new Thread(() -> {
                Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
                System.out.println("X Threaaaaaaaad is starteeeeed");
                synchronized (lock) {
                    System.out.println("X Threaaaaaaaad");
                }
            }).start();

            Thread.sleep(100);
            lock.notifyAll();
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

 }
}

1 个答案:

答案 0 :(得分:0)

如果10个线程在lockobject上等待,则新线程x将立即执行,因为所有其他线程都在等待。

当线程在wait()调用之后进入等待状态时,会释放对象的锁定。所以新线程将获取对象锁并开始执行。当某个线程调用同一个对象上的notify()notifyAll()时,所有10个线程都将生效,否则它们将永远等待。

线程的实际执行将取决于调度,但lockobject上锁的可用性将使线程x立即开始执行。