ReentrantReadWriteLock是AQS的一种实现,分为读锁(共享锁)和写锁(排他锁,独占锁),他可以做到在只有读的时候不阻塞,有写的时候阻塞,具体使用如下:
package test.lock.read.write.lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author: xby
* @Date: 2020/5/22 13:36
*/
public class TestReadWriteLock {
private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock();
private ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock();
public void readLock() {
try {
readLock.lock();
System.out.println(Thread.currentThread().getName() + " read start ");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " read end ");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
readLock.unlock();
}
}
public void writeLock() {
try {
writeLock.lock();
System.out.println(Thread.currentThread().getName() + " write start ");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " write end ");
} catch (Exception e) {
e.printStackTrace();
}finally {
writeLock.unlock();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
TestReadWriteLock readWriteLock = new TestReadWriteLock();
// Thread thread1 = new Thread(()->{readWriteLock.readLock();});
// Thread thread2 = new Thread(()->{readWriteLock.readLock();});
Thread thread1 = new Thread(()->{readWriteLock.readLock();});
Thread thread2 = new Thread(()->{readWriteLock.writeLock();});
thread1.start();
thread2.start();
}
}
根据测试如下:
都是读的时候不阻塞,有写的时候,读写都阻塞。