我见过在java中使用过多次的对象监视器,但在我看来,任何对象监视器逻辑可以很容易地被同步代码块和/或方法。是否真的有必要使用“监视器”对象(java)
使用显式对象监视器的目的是什么,而不仅仅是仔细协调同步代码块和原子基元?
我见过在java中使用过多次的对象监视器,但在我看来,任何对象监视器逻辑可以很容易地被同步代码块和/或方法。是否真的有必要使用“监视器”对象(java)
使用显式对象监视器的目的是什么,而不仅仅是仔细协调同步代码块和原子基元?
但我认为任何对象监视器逻辑可以很容易地通过使用同步代码块和/或方法来代替。
是的,这是因为一杯水可以很容易地被一杯水取代 - 同样的事情。 Java的同步代码块和方法在语言级别上公开了monitor pattern。
我很喜欢它。我不同意这是一条评论。 – duffymo 2012-03-07 21:03:47
@duffymo因为它被编辑我想:) – 2012-03-07 21:05:03
总是有一个监视器对象。当你有同步块时,你的类实例是监视器对象。 所以有理由使用明确的对象:
1)你可以类实例之间共享,以同步共享资源
2)更明确的访问
3)你可以给你的监视器对象有帮助命名
4)更灵活
你让并不存在区别(或使用不常见的术语)。用Java术语来说,监视器是用作同步块的参数的对象(或者,在同步实例方法的情况下,隐式地使用this
实例,并且使用同步静态方法类实例)。
最主要的是一个正常的块使用封闭的对象作为它的监视器,换句话说,它等同于使用synchronized(this) { }
。问题是范围/可见性之一:类的外部任何类都可以选择在同一实例上同步并干扰同步逻辑。通过使用private final
引用作为监视器,这不再可能(假设没有反射shenanigans)。
这在Java Concurrency In Practice配方如下(P61,第4.2.1节):
有使用私人锁定对象,而不是对象的内部锁(或任何其他可公开访问的锁)的优点。使锁对象专用封装锁,以便客户端代码无法获取它,而可公开访问的锁允许客户端代码正确或不正确地参与其同步策略。不恰当地获取另一个对象的锁的客户可能会导致活性问题,并且验证可公开访问的锁是否正确使用需要检查整个程序而不是单个类。
我认为你必须对你的问题更具体。 “对象监视器逻辑”是什么意思?在标准的Java术语中,当你使用“synchronized”时,你在监视器上获得一个锁。这是什么让你感到困惑? – Jochen 2012-03-07 21:00:21
我见过对象声明并用作监视器。我认为你通常可以使用一个简单的布尔或者同步块,而不是用典型的monitor/notifyAll逻辑实现的任意对象。 – jayunit100 2012-03-07 21:12:33