在监视器上同步

时间:2014-02-22 03:41:12

标签: java multithreading

我只是想进一步理解这个概念。

我们有一个监视器,让我们说一个队列或某种地图。此监视器具有放置对象和关闭对象的方法。为了保证线程安全,监视器将锁定它的put方法和它的get方法。当一个线程与该监视器同步时,它会不断尝试获取该监视器的权限,以便它可以继续执行它需要做的事情。这听起来不错吗?

另一个问题是,控制流程如何在这里起作用。一旦线程获得对监视器的访问权限,将执行哪些代码?我发现只用print语句来调试多线程程序很困难,它变得非常混乱和混乱。

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");
    } 
}

2 个答案:

答案 0 :(得分:3)

以下是Java Language Specification的定义:

  

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

回答

  

此监视器具有放置对象和关闭对象的方法。在   为了保证线程安全,监视器将锁定它的put方法和   在它上面获取方法。当线程与此监视器同步时,   它一直试图获得这个显示器的权利,所以它可以   继续做它需要做的事情。听起来不错吗?

所以你没有与显示器交互。监视器没有方法的概念。不要那么想。您与具有监视器的对象进行交互。当一个线程获得一个对象的监视器时,它不需要不断地尝试获取它,它已经拥有它

  

另一个问题是,控制流程如何在这里起作用。哪个代码   一旦线程获得了对监视器的访问权限,就会执行?我   发现只用print就很难调试多线程程序   陈述,它变得非常混乱和混乱。

如果执行进入对象的synchronized块,则当前正在执行的线程已获取synchronized对象上的监视器,在本例中为变量monitor引用的对象。 / p>

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

致电时

monitor.wait();

当前线程在monitor引用的对象上释放监视器并休眠直到它得到通知。

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

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

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

答案 1 :(得分:0)

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