【问题标题】:Benefits of using ReentrantLock over synchronized [duplicate]使用 ReentrantLock 而不是同步的好处 [重复]
【发布时间】:2015-07-25 16:13:55
【问题描述】:

我发现使用 ReentrantLock 而不是同步的另一个好处

下面的代码显示即使在临界区发生异常锁被释放(使用 ReentrantLock )

void someMethod() {
     //get the lock before processing critical section.
   lock.lock();
   try 
   {
   // critical section 
   //if exception occurs
   }
   finally
   {
   //releasing the lock so that other threads can get notifies
   lock.unlock();
   }
}//end of method

现在使用同步

void someMethod() {
     //get the lock before processing critical section.
  synchronized(this) 
  {
    try 
    {
    // critical section 
    //if exception occurs
    }
    finally
    {
    //I don't know how to release lock

    }
  }

}//end of method

通过比较两个代码,我发现使用同步块还有一个缺点 即如果在临界区发生异常,则无法释放锁。

我说的对吗?

如果我错了,请纠正我。

如果同步块中发生异常,是否有释放锁?

【问题讨论】:

  • 好的,如果同步块中间发生异常,则释放锁。对吗?(根据你给我的链接)@s.bandara
  • 内部锁将在synchronized块的右括号执行后释放,你不需要显式地这样做
  • @JavedSolkar,正确!
  • @s.bandara 好的,我明白了
  • 投票重新开放,因为另一个问题没有说明 ReentrantLock 的好处。 ReentrantLock 比 synchronized 更强大。这使得它在某些情况下“有益”,但它也使它成为一个危险的工具。它的权力是; (a) 您可以将锁定与解锁分离(即,这些事情可能以完全不同的方法发生); (b) 您可以将两个或多个单独的条件变量与同一个锁相关联。第 (b) 点在多生产者、多消费者应用程序中尤为重要。

标签: java multithreading reentrantlock synchronized-block


【解决方案1】:

如果同步块中发生异常,锁仍然会被释放。所以在任何情况下都会释放锁。

ReentrantLock 的优点是它们使用比较和扫描,尤其是在低争用情况下表现更好。

【讨论】:

    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2023-03-30
    • 1970-01-01
    • 2018-04-17
    相关资源
    最近更新 更多