import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;java
import com.puff.log.Log;
import com.puff.log.LogFactory;緩存
public class CachedData {
private static Log log = LogFactory.get(HttpUtils.class);
// 緩存都應該是單例的
private static CachedData cachedData = new CachedData();
private final ReadWriteLock lock = new ReentrantReadWriteLock();//讀寫鎖
private Map<String, Object> cache = new HashMap<String, Object>();//緩存 dom
private CachedData(){
} 線程
public static CachedData getInstance(){
return cachedData;
} get
public Object read(String key) {
lock.readLock().lock();
Object obj = null;
try {
obj = cache.get(key);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("============================="+obj);
if (obj == null) {
lock.readLock().unlock();
lock.writeLock().lock();
try {
obj = cache.get(key); //!!!寫的線程這句是在查詢一次
if (obj == null) {
Random random = new Random();
int s = random.nextInt(100)%(100-1+1) + 1;
cache.put(key, s);
log.info("=============================寫入緩存成功"+cache);
}
} finally {
lock.readLock().lock();
lock.writeLock().unlock();
}
}
} finally {
lock.readLock().unlock();
}
return obj;
}
}it