锁定对象与处理对象上的同步

时间:2014-06-18 07:59:04

标签: java multithreading synchronization locking

this Q的代码中,

如果我在某个锁定对象上同步块 而不是对象c本身,代码正在执行 从我看到的,准确的结果几乎快两倍。代码中的其他所有内容都是相同的:

public void update(SomeClass c) {

Object lock = new Object();
    while (<condition-1>) // the conditions here and the calculation of 
                               // k below dont have anything to do 
                               // with the members of c
        if (<condition-2>) {
            // calculate k here 
            synchronized (lock) {                        
                    c.setInt(c.getInt()+k); 
                //    System.out.println("in "+this.toString());
            }
        }  
}  

为什么会这样?

TIA

// =============================

编辑:

通过上面的锁定,线程一个接一个地运行 - 一个线程正在运行整个序列,然后另一个线程接管并运行直到所有seq.is完成&amp;等等。这就是我如何获得准确的结果。为什么会发生这种锁?

1 个答案:

答案 0 :(得分:1)

如果从多个线程(具有相同的SomeClass引用)调用update方法并锁定c,则所有线程将排队等待对c对象的锁定。

如果您改为锁定锁定对象,将在每次方法调用时创建一个新的,并且每个线程将同步它自己的锁(可能不是您想要的),从而加快执行速度