用锁实现缓存机制

来源:互联网 发布:twostepsfromhell知乎 编辑:程序博客网 时间:2024/06/06 02:32
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();}}}

 

原创粉丝点击