显式锁定与隐式锁定

Rol*_*all 6 java concurrency multithreading

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

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

据我所知,我一直在使用隐式锁.我知道的由给定的优势Lock接口实现类似的方法:isLocked(),getLockQueueLength(),getHoldCount(),等...但还是老派的方式(wait()notify())就会有其他的其他限制比没有这些方法?

我也知道用(布尔公平)参数构造一个锁的可能性,它允许缺乏饥饿.

ami*_*ngh 8

是的,绝对可以使用编写线程安全的程序java.util.concurrent.locks.Lock.如果您看到java.util.concurrent.locks.Lock类似ReentrantLock内部实现的任何实现使用旧 synchronized块.

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

除了我的差异,synchronized关键字自然内置了语言支持.这可能意味着JIT可以synchronised blocks以其无法实现的方式进行优化Locks.例如它可以结合起来synchronized blocks.synchronized最适合访问锁的少量线程,Lock并且最适合访问相同锁的大量线程.另外,synchronizedblock 不保证等待进入它的线程被授予访问权限的顺序.


ass*_*ias 5

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

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