【发布时间】:2011-11-06 08:07:35
【问题描述】:
新的 Lock 接口相对于 Java 中的同步块有什么优势?您需要实现一个高性能缓存,允许多个读取器但单个写入器保持完整性您将如何实现它?
【问题讨论】:
-
Lock并不是什么新鲜事物,它从 Java5 就已经存在,即从 2004 年开始
标签: java
新的 Lock 接口相对于 Java 中的同步块有什么优势?您需要实现一个高性能缓存,允许多个读取器但单个写入器保持完整性您将如何实现它?
【问题讨论】:
Lock 并不是什么新鲜事物,它从 Java5 就已经存在,即从 2004 年开始
标签: java
下面列出了锁接口相对于同步的各种优势
与没有死锁问题的锁不同,同步是导致死锁问题的唯一罪魁祸首。
在同步中,我们不知道在前一个线程释放锁之后,一个线程会在多长时间后获得机会。这可能会导致饥饿问题,而在锁的情况下,我们有它的实现类可重入锁,它有一个构造函数,它允许你传递公平属性作为它的参数之一,让最长等待线程有机会获取锁。
在同步中,如果一个线程正在等待另一个线程,那么等待的线程将不会执行任何其他不需要锁访问但使用锁接口的 trylock() 方法,您可以使用它可以尝试访问锁,如果您没有获得锁,您可以执行其他替代任务。这有助于提高应用程序的性能。
没有 api 来检查有多少线程正在等待特定的锁,而这可以通过锁接口实现类来实现 ReentrantLock 方法。
使用lock接口和holdCount()方法可以更好地控制锁,这是同步时找不到的。
【讨论】:
锁的优点是
请注意,javadoc of Lock 及其子类对此进行了说明。
可以使用 ConcurrentMap 实现高性能缓存。
【讨论】:
Lock 有 lockInterruptibly,它允许线程被中断,同时阻止获取锁。
Thread.State.BLOCKED而不是Thread.State.WAITING(或TIMED_WAITING)。
锁接口在多线程和并发编程中的主要优点是它们提供了两个独立的读和写锁,使您能够编写高性能数据结构,如 ConcurrentHashMap 和条件阻塞。
一个线程只能获得一次锁。同步块不提供任何等待队列的机制,在一个线程退出后,任何线程都可以获取锁。这可能会导致其他线程在很长一段时间内资源匮乏。
【讨论】:
您需要知道何时使用 Lock 以及何时使用同步块/方法。
如果您正在创建简单的应用程序,请使用同步块。它避免了竞争条件。但是在避免竞争条件的同时,您可能会导致死锁。
如果您正在创建严肃的应用程序,请使用锁。它还可以避免竞争条件,但您也可以避免死锁。
【讨论】: