我想知道在这种情况下会发生什么:我有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();
}
}
}
答案 0 :(得分:0)
如果10个线程在lockobject
上等待,则新线程x
将立即执行,因为所有其他线程都在等待。
当线程在wait()
调用之后进入等待状态时,会释放对象的锁定。所以新线程将获取对象锁并开始执行。当某个线程调用同一个对象上的notify()
或notifyAll()
时,所有10个线程都将生效,否则它们将永远等待。
线程的实际执行将取决于调度,但lockobject
上锁的可用性将使线程x
立即开始执行。