1. 程式人生 > >快取功能(簡單的synchronized和使用讀寫鎖)

快取功能(簡單的synchronized和使用讀寫鎖)

使用synchronized:

class MyCache{
	private Map<String,Object> cache = new HashMap<String,Object>();
	public synchronized Object getObject(String key){
		//加上鎖是為了避免多個執行緒在得到的value都為null時,都同時去訪問資料庫
		Object value=cache.get(key);
		if(value==null){
			value="aaaaa";//其實是從資料庫中得到相關的記錄
			cache.put(key, value);
		}
		return value;
	}
}
使用讀寫鎖:
class MyCache1{
	private Map<String,Object> cache = new HashMap<String,Object>();
	private ReadWriteLock rwl = new ReentrantReadWriteLock();
	public Object getObject(String key){
		rwl.readLock().lock();
		Object value=cache.get(key);
		if(value==null){
			rwl.readLock().unlock();//必須首先解鎖才能獲取寫鎖
			rwl.writeLock().lock();
			if(value==null){//這裡為什麼還要判斷,避免多個寫鎖被阻塞(因為只能有一個寫鎖是互斥的)的時候,重複對value進行賦值,從而訪問資料庫
				value="aaaaa";//其實是從資料庫中得到相關的記錄
				cache.put(key, value);
			}
			//對鎖進行降級,把寫鎖降級為讀鎖
			rwl.readLock().lock();//重新獲取讀鎖不放棄寫鎖
			rwl.writeLock().unlock();//寫鎖解除,讀鎖仍在
		}
		rwl.readLock().unlock();
		return value;
	}
}