ReentrantReadWriteLock的使用很简单,它其实是ReentrantLock的升级版,在并发读写的时候应用广泛。
它提供了获取读锁和写锁的方法,在调用读写锁的时候,读锁可以并发同时调用,但是写锁只能一个线程调用其他线程等待。
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
public class UseReentrantReadWriteLock {
//读写锁对象
private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
//获得读锁
private ReadLock readLock = rwLock.readLock();
//获得写锁
private WriteLock writeLock = rwLock.writeLock();
public void read() {
readLock.lock();
try {
System.err.println("线程 " + Thread.currentThread().getName() + " 进入了读方法。。。");
Thread.sleep(3000);
System.err.println("线程 " + Thread.currentThread().getName() + " 推出了读方法。。。");
} catch (Exception e) {
e.printStackTrace();
} finally {
readLock.unlock();
}
}
public void write() {
readLock.lock();
try {
System.err.println("线程 " + Thread.currentThread().getName() + " 进入了写方法。。。");
Thread.sleep(3000);
System.err.println("线程 " + Thread.currentThread().getName() + " 执行了写方法。。。");
} catch (Exception e) {
e.printStackTrace();
} finally {
readLock.unlock();
}
}
public static void main(String[] args) {
UseReentrantReadWriteLock urwLock = new UseReentrantReadWriteLock();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
urwLock.read();
}
}, "t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
urwLock.read();
}
}, "t2");
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
urwLock.write();
}
}, "t3");
t1.start();
t2.start();
t3.start();
}
}
测试:
1、注释t3.start();,只测试读结果如下:
2、注释t1.start();,测试读写结果如下:只有线程3执行完了之后线程2才能获取到锁执行