2009-12-14 94 views
16

考虑下面的代码:同步的“参考”或实例

public class Foo { 
    private static final Object LOCK = new Object(); 
    private Object _lockRef1 = LOCK; 
    private Object _lockRef2 = LOCK; 
    private int _indx = 0; 

    public void dec() { 
    synchronized(_lockRef1) { 
     _indx--; 
    } 
    } 

    public void inc() { 
    synchronized(_lockRef2) { 
     _indx++; 
    } 
    } 
} 

是调用方法dec()inc()线程?一方面这些方法在两个不同的实例上同步_ lockRef1和_ lockRef2。在另一方面,这种情况下“点”同一个对象LOCK上...

回答

16

他们不是“同步在两个不同的实例” - 只因为你使用两种不同的变量并不意味着有两个不同的实例。您有几个变量,每个变量都具有相同的值 - 对单个实例java.lang.Object的引用。

所以是的,这是线程安全的。当然,你不应该在可读性方面编写这样的代码,但假设你只是试图理解发生了什么,那很好。

+0

这个问题被标记为'Java',所以我认为这将是'java.lang.Object'。 – Yuval 2009-12-14 11:38:24

+0

@Yuval:Doh--没有发现。谢谢,修正:) – 2009-12-14 11:46:10

+0

明白了!谢谢!实际上,我有一个emun而不是“私人静态最终对象”,但看起来这个想法是一样的。 – Lopotun 2009-12-14 12:14:49