2014-02-22 56 views
0

我只是想进一步理解这个概念。在显示器上同步

我们有一个监视器,让我们说一个队列或某种地图。该监视器具有放置对象的方法,并可以关闭对象。为了线程安全,监视器将锁定它的put方法并且获取方法。当一个线程与该监视器同步时,它会不断尝试获取此监视器的权限,以便能够继续执行所需的操作。这听起来正确吗?

另一个问题,控制流程如何在这里工作。线程访问监视器后执行哪个代码?我发现很难用打印语句来调试多线程程序,它会变得非常混乱和混乱。

public void run(){ 
    try{ 
     synchronized (monitor){ 
      while (monitor is empty){ 
       monitor.wait(); // Does this line pause the thread or the monitor? 
      } 

      System.out.println("Done Waiting"); 
     } 
     System.out.println("Out of the synchronized block"); 
    } 
} 
+1

不要这样想。监视器没有方法或字段或任何东西。监视器不是你可以与之交互的东西。你与对象交互。对象有监视器。 –

回答

3

下面是来自Java Language Specification定义:

Java编程语言提供了多种机制 线程之间进行通信。这些方法中最基本的是使用监视器实现的 同步。 Java中的每个对象 都与一个线程可以锁定或解锁的显示器相关联。 一次只有一个线程可能会在监视器上锁定一个锁。尝试锁定该监视器的任何其他 线程都会被阻止,直到它们可以在该监视器上获取锁定为 。线程t可能会多次锁定某个特定的监视器;每次解锁都会反转一个锁的效果 操作。

要回答

本显示器的方法将物体放在,并获得对象了。在 为了线程安全,监视器将锁定它的放置方法,并在其上获取方法 。当一个线程与这台显示器同步时,它不断地尝试获得这台显示器的权利,所以 可以继续执行它所需要的操作。这听起来正确吗?

所以你没有与显示器进行交互。监视器没有方法的概念。不要这样想。您与具有监视器的对象进行交互。当一个线程获取一个对象的监视器时,它不需要经常试图获取它,它已经有了它

另一个问题,控制流程如何在这里工作。线程访问监视器后,将执行哪个代码 ?我是 发现很难调试多线程程序只是打印 陈述,它会变得非常混乱和混乱。

如果执行进入一个物体上的​​块,当前执行的线程已经获取监视器​​对象上,在这种情况下,由可变monitor引用的对象。

我假设(感谢Radiodeaf)通过monitor is empty,您的意思是您的Map对象没有任何条目。

当你调用

monitor.wait(); 

当前线程释放由monitor引用的对象上保持监视器和休眠,直到它得到通知。

该javadoc的Object#wait()有更多的细节。

因此,您将循环检查是否为空,并等待它返回true。我们可以假设其他一些代码在Map中插入某些内容时会调用notify()

当对象得到通知时,线程必须竞争重新获取对象的监视器。这显然是必要的,以便线程可以在对象的​​块内执行。

+0

*“我不知道你的意思是监视器是空的”* OP的监视器对象是一个Map。 (这是在他们的另一个问题。) – Radiodef

+0

@Radiodef谢谢,我已经编辑,以反映这一点。 –

0

正如我们所知我们只能从同步上下文中调用wait方法。 所以通过说等待释放锁,我们的意思是说,一旦在同步上下文中获取对象的锁时,通过调用同一对象上的等待方法,释放锁并允许其他线程在该对象上工作。

相关问题