我只是想进一步理解这个概念。
我们有一个监视器,让我们说一个队列或某种地图。此监视器具有放置对象和关闭对象的方法。为了保证线程安全,监视器将锁定它的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");
}
}
答案 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方法,它释放锁并允许其他线程在该对象上工作。