【问题标题】:Synchronizing on a lock object vs on the object processed在锁定对象上同步与在处理的对象上同步
【发布时间】:2014-06-18 07:59:03
【问题描述】:

thisQ的代码中,

如果我在某个锁定对象上同步块 而不是对象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. 完成等等。这就是我得到准确结果的方式。为什么会发生这种情况?

【问题讨论】:

  • 你实际上并没有像 lock 那样阻塞在一个局部变量中
  • 是的——你说得对。在上面的代码中,另一件事是线程一个接一个地运行。这就是我得到准确结果的原因。我会把这个添加到 Q
  • 这就是并发错误很难找到和修复的原因。您的代码可以在 99.99% 的时间内产生正确的结果,或者它可以始终您的系统上产生正确的结果。然后,您将其运送给客户,然后它就消失了。

标签: java multithreading synchronization locking


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    相关资源
    最近更新 更多