適用讀寫鎖編寫的一個自定義快取例子
阿新 • • 發佈:2019-01-10
package com.ming.thread;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class MingCache {
/**
* 用過快取的map
*/
private Map<String,Object> cache=new HashMap<String,Object>();
/**
* 讀寫鎖
*/
private ReadWriteLock lock=new ReentrantReadWriteLock();
/**
* 通過快取獲取資料 考慮多執行緒情況
* @author: chenhuaming
* @param key
* @return
* 2018年3月29日下午11:29:28
*/
public Object getData(String key){
lock.readLock().lock();//處理多執行緒讀取安全問題
Object obj=null;
try {
obj = cache.get(key);
if(null==obj){
lock.readLock().unlock();
lock.writeLock().lock();//處理並情況
try {
if(null==obj){//處理併發寫鎖的情況產生的效能問題
obj="ming";//此處去查資料庫
}
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.writeLock().unlock();
}
lock.readLock().lock();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.readLock().unlock();
}
return obj;
}
}