Java并发之读写锁
一.概述
ReentrantLock 实现了一种标准的互斥锁:每次最多只有一个线程能持有ReentrantLock。但对于维护数据的完整性来说,互斥通常是一种强硬的加锁规则,因此也就不必要的限制了并发性。 互斥是一种保守的加锁策略,虽然互斥可以避免 ”写/写“ 冲突和 “写/读” 冲突,但同样也避免了连带的 “读/读” 冲突(在一些对数据结构的读操作,我们应该允许多个线程同时读取),这时后我们就想如果有一种加锁机制能解决这样的问题就好了,这就是 读写锁。
二.具体的学习
1.什么是读写锁?
一个资源可以被多个读操作访问,或者被一个写操作访问,但二者不可以同时进行。
2.Java中的读写锁:
public interface ReadWriteLock{
Lock readLock();
Lock writeLock();
}
上面的ReadWriteLock接口中暴露了两个Lock对象,其中一个用于读操作,一个用于写操作。 要读取ReadWriteLock保护的数据,必须首先获得读取锁,当需要修改ReadWriteLock保护的数据时,必须首先获得写入锁。
1)在读写锁实现的加锁策略中,允许多个读操作同时进行,但每次只允许一个写操作。 与Lock一样,ReadWriteLock可以采用多种不同的实现方式,这些方式在性能,调度保证,获取优先性,公平性以及加锁语义等方面可能有所不同。
注意:读写锁是一种性能优化措施,在一些特定的情况下能实现更高的并发性。 在实际情况中,对于在多处理器系统上被频繁读取的数据结构,读写锁能提高性能,而在其他情况下读写锁的性能略低于独占锁。
3.ReadWriteLock中的一些可选实现包括: