由java synchronized,monitor,wait()和notify()混淆

时间:2014-08-11 13:06:33

标签: java android multithreading

如果这些陈述属实:

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

  2. 当线程在同步区域中调用wait()时,它会将自身的状态设置为阻塞并丢失监视器。线程计划被触发,另一个线程将运行。

  3. 当一个线程(称之为线程A)在同步区域中调用notify()时,JVM将选择一个正在等待监视器并将其状态设置为Runnable的线程(称之为线程B)。

  4. 优先级高于当前运行的线程的线程进入Runnable状态。优先级较低的线程被抢占,优先级较高的线程被安排运行。

  5. 问题:

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

1 个答案:

答案 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,它也必须等到它获得锁定。