用锁实现缓存机制

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值