1. 程式人生 > >用讀寫鎖實現一個快取系統

用讀寫鎖實現一個快取系統

package cn.itcast.gz;
 
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;
 
/**
 * 用讀寫鎖實現的一個快取系統,讀的時候可以併發執行,當快取中沒有資料時,要到資料庫中查詢資料
 * 此時只能寫資料,不能讀資料。當完資料之後,又可以併發地讀取資料。
 * 這樣做的話,可以提高 系統的效率
 * @author long
 *
 */
public class MyCacheSystem {
 
    // 定義一個map用來存放要快取起來的資料
    Map<String, Object> cache = new HashMap<String, Object>();
 
    private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
 
    public static void main(String[] args) {
 
    }
 
    //該方法中,讀資料可以併發地讀取,寫資料與讀資料,寫資料與寫資料之間不能併發地執行
    public Object getData(String key) {
        //剛進來的時候,上一把寫鎖
        rwl.readLock().lock();
        Object obj = null;
        try {
            obj = cache.get(key);
            if (obj == null) {
                //如果資料為空,則需要到資料庫中查詢資料,所以這時候把讀鎖釋放掉,上一把寫鎖,不能同時寫資料
                //在上寫鎖之前,首先要把讀鎖釋放掉
                rwl.readLock().unlock();
                rwl.writeLock().lock();
                // 查詢資料庫的程式碼
                try {
                     
                    //必須重新檢查obj是否為空,因為這時候,另外一個執行緒可能會獲得寫鎖,從而讓obj有值
                    if (obj == null) {
                        obj = "查詢資料庫得到的資料";
                    }
                } finally {
                    rwl.writeLock().unlock();
                }
                //因為前面釋放了寫鎖,所以這裡要把寫鎖重新鎖上
                rwl.readLock().lock();
            }
        } finally {
            rwl.readLock().unlock();
        }
        return obj;
    }
}