6

使用 Locks ( java.util.concurrent.locks.Lock) 而不是关键字synchronized+ 方法wait()和方法notify()完全一样吗?

我可以使用锁(显式锁)而不是隐式锁(synchronized)进行线程安全编程吗?

据了解,我一直在使用隐式锁。我知道Lock接口实现所带来的优势,如方法:isLocked()、、、等......但是,除了没有这些方法之外,老派的方式(getLockQueueLength()和)还有其他限制吗?getHoldCount()wait()notify()

我也知道使用(布尔公平)参数构造锁的可能性,该参数允许缺乏饥饿。

4

2 回答 2

9

是的,您绝对可以使用java.util.concurrent.locks.Lock. 如果您看到java.util.concurrent.locks.Lock类似ReentrantLock内部实现的任何实现都使用旧 synchronized块。

与使用同步方法和语句相比,锁实现提供了更广泛的锁定操作。它们允许更灵活的结构,可能具有完全不同的属性,并且可能支持多个关联的 Condition 对象。

除了我的不同之处,synchronized关键字自然地内置了语言支持。这可能意味着 JIT 可以synchronised blocks以它无法使用的方式进行优化Locks。例如它可以结合synchronized blockssynchronized最适合访问锁的少量线程,并且Lock可能最适合访问相同锁的大量线程。此外synchronized,block也不保证等待进入它的线程被授予访问权限的顺序。

于 2013-05-27T12:17:36.993 回答
3

synchronized从 Java 内存模型的角度来看,锁和块具有相同的语义并提供相同的保证。主要区别在于锁提供了更多控制(例如使用tryLock或要求锁公平等),这允许更灵活和细粒度的锁管理。

但是,当您不需要这些附加功能时,最好使用普通的旧synchronized块,因为它可以减少出错的空间(例如,您不能“忘记”unlock它)。

于 2013-05-27T13:45:02.777 回答