用讀寫鎖實現一個快取系統
阿新 • • 發佈:2019-02-03
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;
}
}
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;
}
}