前言
阅读这篇文章,需要对读锁和写锁有一定的了解。
共享锁(S锁)又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
排他锁(X锁)又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。
本篇文章来介绍ReadWriteLock
,是之前介绍过的ReentrantLock的增强版,同样也是基于CAS的新的同步机制。
之所以说ReadWriteLock是ReentrantLock的升级版,是因为它不仅具有了ReentrantLock的特性,还具备了ReadWriteLock的特性。这点,从它的初始化语句就能看出来:
ReadWriteLock lock = new ReentrantReadWriteLock();
具备了ReentrantLock的特性,是指这个锁也能像ReentrantLock一样,达到保证多线程安全可靠的目的。
具备了ReadWriteLock的特性,是指这个锁可以根据不同的情况,来使用共享锁或者排它锁,从而提高程序运行效率。
下面我们通过代码来演示ReadWriteLock与ReentrantLock之间的区别。
代码演示:与ReentrantLock的区别
代码演示前,先说一下与ReentrantLock之间的不同之处。
ReentrantLock的运行机制是,当一个线程得到了锁之后,其他线程如果想得到这个锁,必须等这个线程释放了锁才行。
但是如果几个线程只是去读取数据而不是修改数据的话,其实完全可以让它们共同读到这些数据的,而不是等一个线程释放锁,其他线程再去争锁。
ReadWriteLock就是解决了这个问题,当某段代码并不修改数据,只是读取数据的话,直接用读锁。这样其他线程如果想读取这个数据,同样可以获得这把读锁,从而提高了效率。
下面是ReadWriteLock实现的读写方法和ReentrantLock实现的读写方法
// 初始化ReadWriteLock
static ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
static Lock readLock = readWriteLock.readLock();
static Lock writeLock = readWriteLock.writeLock();
// ReadWriteLock的读写方法
static void readMethod() {
try {
readLock.lock();
Thread.sleep(1000); // 模拟读操作花费的时间
System.out.println("read over"