显式锁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();  // 全局

 

更多线程安全链接:

线程安全

posted @ 2017-12-26 17:50  晕菜一员  阅读(345)  评论(0编辑  收藏  举报