package com.study;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockDemo {
private static Map cacheMap = new LinkedHashMap();
public static void main(String[] args) {
ReadWriteLockDemo readWriteLockDemo = new ReadWriteLockDemo();
final CacheUtils cacheUtils = readWriteLockDemo.new CacheUtils();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for(Integer index = 0;index <= 100;index ++){
System.out.println(cacheUtils.putCache(index.toString()));
}
}
});
thread.start();
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
for(Integer index = 0;index <= 100;index ++){
System.out.println(cacheUtils.putCache(index.toString()));
}
}
});
thread2.start();
}
class CacheUtils {
// 定义一把读写锁
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
public Object putCache(String key){
//进来时,先用读锁进行上锁
readWriteLock.readLock().lock();
Object value = null;
try {
value = cacheMap.get(key);
if(value == null){
readWriteLock.readLock().unlock();
try {
readWriteLock.writeLock().lock();
if(value == null){
//此处实际上是查询DB
value = "huangkejie" + key;
cacheMap.put(key, value);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
readWriteLock.writeLock().unlock();
}
readWriteLock.readLock().lock();
}
} catch (Exception error) {
error.printStackTrace();
} finally{
readWriteLock.readLock().unlock();
}
return value;
}
}
}