2011-11-06 62 views

回答

10

锁的优点是

  • 有可能使他们公平
  • 有可能让一个线程响应中断而锁定对象上等待。
  • 有可能试图获取锁,但立即返回或超时后,如果锁不能获得
  • 有可能获得在不同的范围释放锁,并在不同的顺序

请注意,这在javadoc of Lock及其子类中有解释。

高性能缓存可以使用ConcurrentMap来实现。

+0

第二点似乎措辞不妙。您可以中断在正常的内部Java监视器上等待的线程。 'Lock'具有'lockInterruptibly',它可以在阻塞获取锁的同时中断线程。 –

+0

@Tom:你当然可以中断阻塞的内存等待内部监视器,但是线程不会响应中断。这就是我的意思:中断方法将被调用,但是线程在获取锁之前不会自行中断,并且可以永远保持这种状态。我已经改变了措辞,使其更加明确。 –

+0

关键是目标线程在'Thread.State.BLOCKED'而不是'Thread.State.WAITING'(或'TIMED_WAITING')。 –

-4

您需要知道何时使用锁定以及何时使用同步块/方法。

  • 如果您正在创建简单应用程序,请使用同步块。它避免了竞赛条件。但是,在避免竞争条件的情况下,您可能会造成死锁。

  • 如果您正在创建严重的应用程序,请使用锁定。它也避免了竞争条件,但你也有避免死锁的好处。

+1

这实际上并不是在同步锁和显式锁之间进行选择的关键。一个严重的应用程序可能很简单,使用锁定显然也会导致死锁,如同步一样。 –

相关问题