显式锁Lock 和 ReentrantLock
Lock 是 一个接口,提供了无条件的、可轮询的、定时的、可中断的的锁获取操作,所有加锁和解锁的方法都是显式的。
package路径:java.util.concurrent.locks.Lock。
核心方法:lock() , unlock() , tryLock()
实现类:ReentrantLock , ReentrantReadWriteLock.ReadLock , ReentrantReadWriteLock.WriteLock。
ReentrantLock 是 Lock的实现类, 是一个互斥的同步器,它具有扩展能力。
比synchronized 实现更具有可伸缩性。比synchronized 吞吐量好。
多线程访问ReentrantLock 保护的共享资源时, JVM将话费较少的时间来调度线程,而用更多的时间执行线程。
ReentrantLock 是一个很好的通用的锁实现,使用于比较简单的加锁,解锁的业务逻辑,如果实现复杂的的锁机制,当线程增长能够预估时也是可以的。
使用:
1 class Count { 2 3 private final ReentrantLock lock = new ReentrantLock(); 4 5 // ... 6 7 public void add() { 8 9 lock.lock(); // 获得锁 10 11 try { 12 13 // 方法体 14 15 } finally { 16 17 lock.unlock(); // 解锁 18 } 19 } 20 }
Lock 与 synchronized 比较:
(1)Lock 比较灵活,但是必须有释放锁的动作配合。
(2)Lock必须手动开启锁和释放锁,而synchronized 不需要手动开启和释放锁。
(3)Lock只适用于代码块锁,而synchronized 对象之间的互斥关系。
注意:如需要互斥,则需要使用同一个ReentrantLock。不能将锁独立。
private final ReentrantLock lock = new ReentrantLock(); // 全局
更多线程安全链接: