用锁实现缓存机制

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();
		}
	}
}

 

你可能感兴趣的:(缓存)