ReentrantLock和读写锁
Posted yuyuchen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReentrantLock和读写锁相关的知识,希望对你有一定的参考价值。
在Java5.0之前,只有synchronized(内置锁)和volatile. Java5.0后引入了显示锁ReentrantLock.
ReentrantLock概况
ReentrantLock是可重入的锁,它不同于内置锁, 它在每次使用都需要显示的加锁和解锁, 而且提供了更高级的特性:公平锁, 定时锁, 有条件锁, 可轮询锁, 可中断锁. 可以有效避免死锁的活跃性问题.ReentrantLock实现了
Lock接口:
public interface Lock { //阻塞直到获得锁或者中断 void lock(); //阻塞直到获得锁或者中断抛异常 void lockInterruptibly() throws InterruptedException; //只有锁可用时才获得,否则直接返回 boolean tryLock(); //只有锁在指定时间内可用时才获得,否则直接返回,中断时抛异常 boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); //返回一个绑定在这个锁上的条件 Condition newCondition(); }
Lock使用
Lock lock = new ReentrantLock(); lock.lock(); try{ //更新对象状态 }finally{ //这里注意,一定要有finally代码块去解锁 //否则容易造成死锁等活跃性问题 lock.unlock(); }
ReentrantLock特性
轮询锁的和定时锁
可轮询和可定时的锁请求是通过tryLock()方法实现的,和无条件获取锁不一样. ReentrantLock可以有灵活的容错机制.死锁的很多情况是由于顺序锁引起的, 不同线程在试图获得锁的时候阻塞,并且不释放自己已经持有的锁, 最后造成死锁. tryLock()方法在试图获得锁的时候,如果该锁已经被其它线程持有,则按照设置方式立刻返回,而不是一直阻塞等下去,同时在返回后释放自己持有的锁.可以根据返回的结果进行重试或者取消,进而避免死锁的发生.
公平性
可中断获锁获取操作
读写锁ReadWriteLock
?ReentrantLock是一种标准的互斥锁,每次最多只有一个线程能持有锁。读写锁不一样,暴露了两个Lock对象,其中一个用于读操作,而另外一个用于写操作。
-
public interface ReadWriteLock { /** * Returns the lock used for reading. * * @return the lock used for reading. */ Lock readLock(); /** * Returns the lock used for writing. * * @return the lock used for writing. */ Lock writeLock(); }
- 释放优先
- 读线程插队
- 重入性
- 降级
- 升级
public class ReadWriteMap<K, V> { private Map<K, V> map; private final ReadWriteLock lock = new ReentrantReadWriteLock(); private final Lock readLock = lock.readLock(); private final Lock writeLock = lock.writeLock(); public ReadWriteMap(Map<K, V> map) { this.map = map; } public V get(K key) { readLock.lock(); try { return map.get(key); } finally { readLock.unlock(); } } public void put(K key, V value) { writeLock.lock(); try { map.put(key, value); } finally { writeLock.unlock(); } } }
以上是关于ReentrantLock和读写锁的主要内容,如果未能解决你的问题,请参考以下文章
架构师养成记--14.重入锁ReentrantLock 和 读写锁 ReentrantReadWriteLock
synchronizedLock接口Condition接口读写锁及ReentrantLock(重入锁) 特性及使用
java并发-锁-ReentrantLock(重入锁)和ReentrantReadWriteLock(读写锁)