Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java lock.notify()是否仅在线程的循环结束时执行_Java_Multithreading_Thread Safety_Wait_Notify - Fatal编程技术网

Java lock.notify()是否仅在线程的循环结束时执行

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块之后放置断点,然后您将看到正在

在上述代码中, 当前执行结果:我可以看到lock.notify()仅在while循环结束后才被调用

我的假设是,lock.notify()在count变量递增后立即被调用,它应该立即通知等待的线程恢复执行,而不是在执行调用的第二个线程完成后等待线程恢复执行,这是什么原因,有人能纠正我的理解有什么问题吗

谢谢。

您的推论——“我可以看到lock.notify()仅在while循环结束后才被调用”并不完全正确。尝试运行多次,或者在thread2的
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;

                }

            }


        }
    }


}