使用锁(java.util.concurrent.locks.Lock
)而不是关键字synchronized
+方法wait()
和方法notify()
完全相同吗?
我可以使用锁(显式锁)而不是隐式锁(synchronized
)对线程进行安全编程吗?
众所周知,我一直在使用隐式锁。我知道像方法这样的Lock
接口(interface)实现所带来的优势:isLocked()
,getLockQueueLength()
,getHoldCount()
等...但是,除了没有这些方法之外,旧的方式(wait()
和notify()
)还有其他限制吗?
我也知道用( boolean 公平性)参数构造一个锁的可能性,该锁允许缺少饥饿。
最佳答案
是的,绝对可以使用java.util.concurrent.locks.Lock
编写线程安全程序。如果您看到java.util.concurrent.locks.Lock
的任何实现,例如ReentrantLock
,则内部实现将使用旧的synchronized
块。
锁定实现提供的锁定操作比使用同步方法和语句可获得的锁定操作更广泛。它们允许更灵活的结构,可以具有完全不同的属性,并且可以支持多个关联的Condition对象。
令我与众不同的是,synchronized
关键字自然已经内置了语言支持。这可能意味着JIT可以使用synchronised blocks
无法实现的方式优化Locks
。例如它可以结合synchronized blocks
。 同步的最适合少数访问锁的线程,而Lock
最好最适合访问相同锁的线程。同样,synchronized
块使无法保证有关等待进入该线程的线程被授予访问权限的顺序。