使用Locks(
java.util.concurrent.locks.Lock)而不是关键字synchronized方法wait()和方法notify()完全一样吗?
我可以使用锁(显式锁)而不是隐式锁(同步)来线程安全地编程吗?
据我所知,我一直在使用隐式锁.我知道Lock接口实现给出的优点,比如方法:isLocked(),getLockQueueLength(),getHoldCount()等…但是仍旧旧学校方式(wait()和notify())会有其他限制除了没有那些方法?
我也知道用(布尔公平)参数构造一个锁的可能性,它允许缺乏饥饿.
解决方法
是的,绝对可以使用java.util.concurrent.locks.Lock编写线程安全的程序.如果你看到java.util.concurrent.locks.Lock的任何实现,像ReentrantLock内部实现使用旧的synchronized块.
锁实现提供了比使用同步方法和语句获得的更广泛的锁操作.它们允许更灵活的结构,可能具有完全不同的属性,并且可以支持多个关联的Condition对象.
除了我的差异,synchronized关键字自然内置了语言支持.这可能意味着JIT可以以Locks无法实现的方式优化同步块.例如它可以组合synchronized blocks.synchronized最适合访问锁的少量线程,Lock可能最适合访问相同锁的大量线程.同步块也不保证等待进入它的线程被授予访问权限的顺序.