我正在努力了解notify
& notifyAll
不同。
让我们考虑一下线程t1
正在使用资源R
的情况。现在两个线程t2
& t3
正在等待相同的资源。如果t1
在notify
上调用R
方法,t2
& t3
会开始吗?如果t1
在notifyAll
上调用R
方法,t2
和t3
我们会通知IEnumerator
,但由于他们仍在竞争同一资源,因此其中只有一人应该可以启动。哪一个能够这样做?
答案 0 :(得分:0)
你猜不出哪一个确切地开始起作用。 Java Docs说这是任意选择。
答案 1 :(得分:0)
Object.notify()将选择一个随机等待线程并通知锁定 释放后,它可以继续为自己获得锁定。 Object.notifyAll()将通知正在等待锁定的所有线程 那个对象和他们竞争获得锁定。
最初我们可能会想,如果我为每个线程设置不同的优先级,那么我 可以控制序列。但事实并非如此,优先事项并不能保证 优先级较高的线程将运行。
但是如果你真的想控制线程执行的使用顺序 线程同步器。
测试线程选择中的优先级很少:
public class NotifyVSNotifyAll {
public static void main(String[] args) {
Object resource = new Object();
Thread a=new Thread(()->{
synchronized (resource) {
System.out.println("A");
try{
Thread.sleep(2000);
resource.notify();
//resource.notifyAll();
}catch(Exception E){}
}
});
Thread b=new Thread(()->{
synchronized (resource) {
System.out.println("B");
}
});
Thread c=new Thread(()->{
synchronized (resource) {
System.out.println("C");
}
});
a.setPriority(10);
b.setPriority(1);
c.setPriority(10);
a.start();
c.start();
b.start();
}
}
Hope its clear.