ReentrantReadWriteLock 为可重入读写锁,实现ReadWriteLock接口,他包含一个读锁(ReentrantReadWriteLock.ReadLock),一个写锁(ReentrantReadWriteLock.WriteLock),实现Lock接口。
读写锁,读读不互斥,读写互斥,写写互斥。
示例代码如下:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
*
* @author wjw
*/
public class ReentrantReadWriteLockTest {
static ReadWriteLock lock = new ReentrantReadWriteLock();
static Lock readLock = lock.readLock();
static Lock writeLock = lock.writeLock();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
utils.Utils.sleep(1 * 1000);
read();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
utils.Utils.sleep(1 * 100);
read();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
write();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
write();
}
}).start();
}
public static void read(){
try{
readLock.lock();
System.out.println(Thread.currentThread().getName() + "读取数据中...");
utils.Utils.sleep(10 * 1000);
System.out.println(Thread.currentThread().getName() + "读数据完毕!");
}finally{
readLock.unlock();
}
}
public static void write(){
try{
writeLock.lock();
System.out.println(Thread.currentThread().getName() + "写数据中...");
utils.Utils.sleep(10 * 1000);
System.out.println(Thread.currentThread().getName() + "写数据完毕!");
}finally{
writeLock.unlock();
}
}
}
执行结果:
Thread-2写数据中...
Thread-2写数据完毕!
Thread-3写数据中...
Thread-3写数据完毕!
Thread-1读取数据中...
Thread-0读取数据中...
Thread-1读数据完毕!
Thread-0读数据完毕!
如有错误,欢迎指正
end