import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * 缓存工具类 * Created by Administrator on 2016/8/17. */ public class CacheData { public static void main(String[] arg) { CacheData cd = new CacheData(); for (int i=0; i < 5; i++) { final int temtInt = i; new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(cd.getData("ss"+temtInt)); } }).start(); } } private Map<String, Object> cacheMap = new HashMap<String,Object>(); private ReadWriteLock rwl = new ReentrantReadWriteLock(); public Object getData(String key) { rwl.readLock().lock(); System.out.println("当前线程"+Thread.currentThread().getName()+"正在准备读数据"); Object obj = null; try { //"没有找到key对应的value"; if (!cacheMap.containsKey(key)) { rwl.readLock().unlock(); rwl.writeLock().lock(); System.out.println("当前线程"+Thread.currentThread().getName()+"取消读数据,准备写数据"); try { System.out.println("当前线程"+Thread.currentThread().getName()+"正准备写数据"); if(obj == null) { cacheMap.put(key, key); } } finally { rwl.writeLock().unlock(); System.out.println("当前线程"+Thread.currentThread().getName()+"写数据完成"); rwl.readLock().lock(); System.out.println("当前线程"+Thread.currentThread().getName()+"正在准备读数据"); } } obj = cacheMap.get(key); } finally { rwl.readLock().unlock(); System.out.println("当前线程"+Thread.currentThread().getName()+"读数据完成"); } return obj; } }
转载于:https://my.oschina.net/u/3052/blog/734322