package cn.itcast.ReentrantReadWriteLock;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import static cn.itcast.n2.util.Sleeper.sleep;
@Slf4j(topic = "c.TestReentrantReadWriteLock")
public class TestReentrantReadWriteLock {
public static void main(String[] args) throws InterruptedException {
DataContainer dataContainer = new DataContainer();
//[1]-读锁-读锁 可以并发
/*new Thread(dataContainer::read, "t1").start();
new Thread(dataContainer::read, "t2").start();*/
//[2]-读锁-写锁 相互阻塞
/*new Thread(dataContainer::read, "t1").start();
Thread.sleep(100);
new Thread(dataContainer::write, "t2").start();*/
//[3]-写锁-写锁 相互阻塞
/*new Thread(dataContainer::write, "t1").start();
Thread.sleep(100);
new Thread(dataContainer::write, "t2").start();*/
//[4]-重入时升级不支持:持有读锁的情况下不可以获取写锁
/*new Thread(dataContainer::readWrite, "t1").start();*/
/**
* 13:24:00.800 c.DataContainer [t1] - 获取读锁...
* 13:24:00.802 c.DataContainer [t1] - 读取。。。。。。。。。。。。
* 13:24:02.803 c.DataContainer [t1] - 【重入】获取写锁...
*/
//[5]-重入时降级支持:持有写锁的情况下可以获取读锁
new Thread(dataContainer::writeRead, "t1").start();
/**
* 13:25:52.540 c.DataContainer [t1] - 获取写锁...
* 13:25:52.541 c.DataContainer [t1] - 写入。。。。。。。。。。。。
* 13:25:54.552 c.DataContainer [t1] - 【重入】获取读锁...
* 13:25:54.552 c.DataContainer [t1] - 【重入】读。。。。。。。。。。。。
* 13:25:56.553 c.DataContainer [t1] - 【重入】释放读锁...
* 13:25:56.553 c.DataContainer [t1] - 释放写锁...
*/
}
@Slf4j(topic = "c.DataContainer")
private static class DataContainer {
private Object data;
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private final ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
private final ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
public Object read() {
log.debug("获取读锁...");
readLock.lock();
try {
log.debug("读取。。。。。。。。。。。。");
sleep(2);
return data;
} finally {
log.debug("释放读锁...");
readLock.unlock();
}
}
public void write() {
log.debug("获取写锁...");
writeLock.lock();
try {
log.debug("写入。。。。。。。。。。。。");
sleep(1);
} finally {
log.debug("释放写锁...");
writeLock.unlock();
}
}
public void readWrite() {
log.debug("获取读锁...");
readLock.lock();
try {
log.debug("读取。。。。。。。。。。。。");
sleep(2);
log.debug("【重入】获取写锁...");
writeLock.lock();
try {
log.debug("【重入】写。。。。。。。。。。。。");
sleep(2);
} finally {
log.debug("【重入】释放写锁...");
writeLock.unlock();
}
} finally {
log.debug("释放读锁...");
readLock.unlock();
}
}
public void writeRead() {
log.debug("获取写锁...");
writeLock.lock();
try {
log.debug("写入。。。。。。。。。。。。");
sleep(2);
log.debug("【重入】获取读锁...");
readLock.lock();
try {
log.debug("【重入】读。。。。。。。。。。。。");
sleep(2);
} finally {
log.debug("【重入】释放读锁...");
readLock.unlock();
}
} finally {
log.debug("释放写锁...");
writeLock.unlock();
}
}
}
}
ReentrantReadWriteLock测试代码
最新推荐文章于 2024-09-29 12:06:46 发布