線程 讀寫鎖

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

相關文章
相關標籤/搜索