如果这些陈述属实:
当线程进入同步区域(方法或块)时,它将获取对象监视器,然后区域中没有wait()或notify()调用,因此退出该区域时,它会丢失监视器。
当线程在同步区域中调用wait()时,它会将自身的状态设置为阻塞并丢失监视器。线程计划被触发,另一个线程将运行。
当一个线程(称之为线程A)在同步区域中调用notify()时,JVM将选择一个正在等待监视器并将其状态设置为Runnable的线程(称之为线程B)。
优先级高于当前运行的线程的线程进入Runnable状态。优先级较低的线程被抢占,优先级较高的线程被安排运行。
问题:
因此,在案例3中,如果线程B具有更高的优先级,则将发生线程调度并且线程B将运行。现在线程A仍然有监视器,线程B如何运行?
答案 0 :(得分:1)
因此,在案例3中,如果线程B具有更高的优先级,则将发生线程调度并且线程B将运行。现在线程A仍然有监视器,线程B如何运行? - 错误。
一旦Thread-A调用notify()
,线程B将不会启动执行。它仍然必须锁定当前由线程A保持的对象。一旦thread-A 退出同步块或调用wait()
,线程B就可以获得对象的锁定(一旦Thread-A退出synchronized块或调用wait()
,它释放了锁)。一旦thread-B锁定了该对象,它就会开始执行。
即使Thread-B的优先级高于thread-A,它也必须等到它获得锁定。