packageconstxiong.concurrency.a18;importjava.util.HashMap;importjava.util.Map;importjava.util.Random;importjava.util.concurrent.locks.ReadWriteLock;importjava.util.concurrent.locks.ReentrantReadWriteLock;/*** 测试可重入读写锁 ReentrantReadWriteLock
*@authorConstXiong
* @date 2019-09-19 11:36:19*/
public classTestReentrantReadWriteLock {//存储 key value 的 map
private Map map = new HashMap();//读写锁
private final ReadWriteLock lock = newReentrantReadWriteLock();/*** 根据 key 获取 value
*@paramkey*/
publicObject get(String key) {
Object value= null;
lock.readLock().lock();try{
Thread.sleep(50L);
value=map.get(key);
}catch(InterruptedException e) {
e.printStackTrace();
}finally{
lock.readLock().unlock();
}returnvalue;
}/*** 设置key-value
*@paramkey*/
public voidset(String key, Object value) {
lock.writeLock().lock();try{
Thread.sleep(50L);
map.put(key, value);
}catch(InterruptedException e) {
e.printStackTrace();
}finally{
lock.writeLock().unlock();
}
}//测试5个线程读数据,5个线程写数据
public static voidmain(String[] args) {//创建测试可重入读写锁 TestReentrantReadWriteLock 对象
TestReentrantReadWriteLock test = newTestReentrantReadWriteLock();
String key= "lock";//存入 map 中的 key
Random r = new Random();//生成随机数作为 value
for (int i = 0; i < 5; i++) {//5 个线程读 map 中 key 的 value
new Thread(() ->{for (int j = 0; j < 10; j++) {
System.out.println(Thread.currentThread().getName()+ " read value=" +test.get(key));
}
}).start();//5 个线程写 map 中 key 的 value
new Thread(() ->{for (int j = 0; j < 10; j++) {int value = r.nextInt(1000);
test.set(key, value);
System.out.println(Thread.currentThread().getName()+ " write value=" +value);
}
}).start();
}
}
}