Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.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同步化、监视、等待()和通知()弄糊涂了_Java_Android_Multithreading - Fatal编程技术网

被java同步化、监视、等待()和通知()弄糊涂了

被java同步化、监视、等待()和通知()弄糊涂了,java,android,multithreading,Java,Android,Multithreading,如果这些说法属实: 当线程进入一个同步区域(方法或块)时,它将获得对象监视器,然后该区域中没有wait()或notify()调用,因此当退出该区域时,它将丢失监视器 当线程在同步区域中调用wait()时,它会将自身的状态设置为blocked并丢失监视器。线程调度已触发,另一个线程将运行 当一个线程(称为thread a)调用同步区域中的notify()时,JVM将选择一个线程(称为thread B),该线程任意等待监视器,并将其状态设置为Runnable 优先级高于当前运行线程的线程进入可运行状

如果这些说法属实:

  • 当线程进入一个同步区域(方法或块)时,它将获得对象监视器,然后该区域中没有wait()或notify()调用,因此当退出该区域时,它将丢失监视器

  • 当线程在同步区域中调用wait()时,它会将自身的状态设置为blocked并丢失监视器。线程调度已触发,另一个线程将运行

  • 当一个线程(称为thread a)调用同步区域中的notify()时,JVM将选择一个线程(称为thread B),该线程任意等待监视器,并将其状态设置为Runnable

  • 优先级高于当前运行线程的线程进入可运行状态。低优先级线程被抢占,高优先级线程被调度运行

  • 问题:


    因此,在案例3中,如果线程B具有更高的优先级,则会发生线程调度,线程B将运行。现在线程A仍然有监视器,线程B如何运行

    因此,在案例3中,如果线程B具有更高的优先级,则会发生线程调度,线程B将运行。现在线程A仍然有监视器,线程B如何运行?-错误

    一旦Thread-A调用
    notify()
    ,Thread-B将不会开始执行。它仍然必须获得Thread-A当前持有的对象的锁。一旦Thread-A退出同步块或调用
    wait()
    ,Thread-B就可以获得对象的锁(一旦Thread-A退出同步块或调用
    wait())
    ,它会释放锁)。一旦线程B锁定了该对象,它就开始执行


    即使线程B的优先级高于线程A,它也必须等到获得锁。

    线程B必须重新获取监视器,然后才能继续,基本上……这是4个问题。