package test1;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;



/**
* 通过锁,实现缓存机制
* 伪代码
* @author Administrator
*
*/
public class CatchUsedLock {

public static void main(String[] args) {

}

private Map<String, Object> map = new HashMap<String, Object>();

// 此方法,多个线程进来,会多次操作数据库
public void getData1 (String key) {
if (map.get(key) == null) {
map.put(key, "到数据库中取相关数值");
}
}


// 此方法在读的时候被互斥,效率不高,按需求,只需要在写的时候互斥
public synchronized void getData2 (String key) {
if (map.get(key) == null) {
map.put(key, "到数据库中取相关数值");
}
}

// 应使用此方法
private ReadWriteLock lock = new ReentrantReadWriteLock();
public synchronized void getData3 (String key) {
try {
lock.readLock().lock();
Object val = map.get(key);
if (val == null) {
lock.readLock().unlock();
lock.writeLock().lock();
// 此处还需再判断一次,防止当多个线程都被阻塞在lock.writeLock().lock();
// 然后一个线程从数据库中取值后,走完,解锁,另一个线程进来发现是空的,又走一次数据库。
val = map.get(key);
if (val == null) {
val = "到数据库中取相关数值";
map.put(key, val);
}
lock.writeLock().unlock();
lock.readLock().lock();
}
} finally {
lock.readLock().unlock();
}
}
}