Java lock.notify()是否仅在线程的循环结束时执行
在上述代码中, 当前执行结果:我可以看到lock.notify()仅在while循环结束后才被调用 我的假设是,lock.notify()在count变量递增后立即被调用,它应该立即通知等待的线程恢复执行,而不是在执行调用的第二个线程完成后等待线程恢复执行,这是什么原因,有人能纠正我的理解有什么问题吗 谢谢。您的推论——“我可以看到lock.notify()仅在while循环结束后才被调用”并不完全正确。尝试运行多次,或者在thread2的Java lock.notify()是否仅在线程的循环结束时执行,java,multithreading,thread-safety,wait,notify,Java,Multithreading,Thread Safety,Wait,Notify,在上述代码中, 当前执行结果:我可以看到lock.notify()仅在while循环结束后才被调用 我的假设是,lock.notify()在count变量递增后立即被调用,它应该立即通知等待的线程恢复执行,而不是在执行调用的第二个线程完成后等待线程恢复执行,这是什么原因,有人能纠正我的理解有什么问题吗 谢谢。您的推论——“我可以看到lock.notify()仅在while循环结束后才被调用”并不完全正确。尝试运行多次,或者在thread2的synchronized块之后放置断点,然后您将看到正在
synchronized
块之后放置断点,然后您将看到正在打印thread1“我收到通知”
从notify()
-
唤醒的线程将无法继续,直到当前
线程放弃对此对象的锁定
在您的情况下,在thread2放弃锁,然后thread1获取锁之前,thread2通过进入synchronized
块再次获取锁。您的推断——“我可以看到锁。notify()仅在while循环结束后被调用”并不完全正确。尝试运行多次,或者在thread2的synchronized
块之后放置断点,然后您将看到正在打印thread1“我收到通知”
从notify()
-
唤醒的线程将无法继续,直到当前
线程放弃对此对象的锁定
在您的情况下,在thread2放弃锁,然后thread1获取锁之前,thread2通过进入
synchronized
块再次获取锁。请显示您期望的内容和实际输出。提示:调用sleep(…)
在synchronized
块或synchronized
方法中,几乎总是一个坏主意。@SolomonSlow是的,我知道,如果你在第一个线程上看到我没有使用睡眠,我正在试验一些东西,并且在这里放置时没有删除第二个线程中的代码。请显示你期望的内容和实际输出。提示:调用sleep(…)
在同步的
块或同步的
方法中几乎总是一个坏主意。@SolomonSlow是的,我知道,如果你看到在第一个线程中我没有使用睡眠,我正在试验一些东西,在第二个线程中没有删除该代码,而在这里放置..可能是,调用notify确实会立即通知正在等待的线程,但我们不知道它何时会恢复执行。这取决于操作系统的调度程序。例如,如果您的硬件在任何实例上只支持一个活动线程,则在Thread2完成其执行之前Thread1将无法运行,这是否也是一个原因?是的,可能是。可能是,调用notify确实会立即通知等待的线程,但我们不知道它何时将恢复其执行。这取决于操作系统的调度程序。例如,如果您的硬件在任何实例上只支持一个活动线程,则在Thread2完成其执行之前,Thread1将无法运行,这是否也是一个原因?是的,可能是。
public class MyVisibility {
private static int count = 0;
private static Object lock = new Object();
public static void main(String[] args) {
new MyVisibility.thread1().start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
return;
}
new MyVisibility.thread2().start();
}
static class thread1 extends Thread {
int i = 0;
@Override
public void run() {
super.run();
while (true) {
synchronized (lock) {
count++;
System.out.println("Thread one count is " + count);
try {
lock.wait();
System.out.println("i am notified");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (count > 5) {
return;
}
}
}
}
static class thread2 extends Thread {
int i = 10;
@Override
public void run() {
super.run();
while (true) {
synchronized (lock) {
count++;
System.out.println("Thead 2 count is " + count);
lock.notify();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (count > 10) {
return;
}
}
}
}
}