同步和重入锁定之间的区别?

noM*_*MAD 21 java thread-safety

synchronized在Java中使用了关键字和重入锁,但我不明白它们之间的区别,或者哪种情况适合于给定的情况.

我如何决定何时使用synchronized以及何时使用可重入锁?

Jay*_*Jay 24

一个ReentrantLock的是:

可重入互斥锁具有与使用同步方法和语句访问的隐式监视器锁相同的基本行为和语义,但具有扩展功能.

扩展功能包括:

  1. 每个监视器具有多个条件变量的能力.使用synchronized关键字的监视器只能有一个.这意味着可重入锁支持多个wait()/ notify()队列.
  2. 使锁具公平的能力.同步块是不公平的.

    "[fair]锁定有利于授予对等待时间最长的线程的访问权限.否则此锁定不保证任何特定的访问顺序."

  3. 能够检查是否正在进行锁定.
  4. 获取等待锁定的线程列表的能力.

重入锁的缺点是:

  1. 需要添加import语句.
  2. 需要在try/finally块中包装锁定获取.这使得它比synchronized关键字更难看.
  3. synchronized关键字可以放在这避免了这降低嵌套的块需要的方法的定义.

摘要

synchronized关键字在语法上是更好,但重入锁具有更多的功能.


Bob*_*har 0

我一直认为同步是“阻力最小的方法”。它确实有效,而且大多数人都了解它是如何工作的,但它有一些弱点,可能会在高并发情况下影响您的设计。尤其重要的是,任何客户端都可以有效地直接访问对象的同步锁,这意味着如果他们抓住并持有它,其他客户端就无法获得它。换句话说,默认同步实现的锁定有效地“发布”了对象的内部锁定机制。哎呀。这就像让自己陷入自我造成的拒绝服务。

如果您将可重入锁设置为您的类的内部(或者只是不使用同步,而是在您想要同步的任何地方在构造函数中新建的某个内部对象上执行诸如同步之类的操作),则可以消除发布的这种副作用您的内部锁定机制,随着您的类的发展,您必须记住在哪里应用此内部同步,这增加了复杂性。