Java數(shù)據(jù)緩存實現(xiàn)的核心機制
在大數(shù)據(jù)量訪問讀取中,數(shù)據(jù)緩存是最普遍采用的解決方案之一,但在讀過很多代碼的緩存實現(xiàn),代碼可圈可點的彈性都很大,在一并發(fā)數(shù)不多時,功能是完全沒有問題的,但是對大數(shù)量的多并發(fā)操作上就有些差強人意了。以下為集數(shù)家之長實現(xiàn)的數(shù)據(jù)緩存核心機制代碼片段,以拋磚引玉,供大家學習,此片段的核心代碼參考sun的源碼實現(xiàn)。
sun沒有對此段代碼開放,它的功能在ArrayBlockingQueue(jdk1.5)中已經(jīng)實現(xiàn)并提供開放接口。沒有時間看下面的代碼的可直接查看ArrayBlockingQueue的api,如果對象ArrayBlockingQueue也沒有興趣的同學,可以直接調(diào)用ConcurrentHashMap(jdk1.5), ConcurrentSkipListMap(jdk1.6),這些類,api中有更加祥細的說明,這里不多說,需要注意的是因為此功能解決多線程并發(fā)問題,故null不能做為key和value的鍵值,可以理解為HashTable的提升。
- package com.henry;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.Random;
- import java.util.concurrent.locks.ReadWriteLock;
- import java.util.concurrent.locks.ReentrantReadWriteLock;
- public class CacheDataTest {
- static Map<Integer,Object> dataMap=new HashMap<Integer,Object>();
- static ReadWriteLock lock=new ReentrantReadWriteLock();//創(chuàng)建讀寫鎖的實例
- static Object getData(Integer key){
- lock.readLock().lock();//讀取前先上鎖
- Object val=null;
- try{
- val=dataMap.get(key);
- if(val == null){
- // Must release read lock before acquiring write lock
- lock.readLock().unlock();
- lock.writeLock().lock();
- try{ if(val==null){
- //dataMap.put(key, "");//query from db
- val=queryDataFromDB(key); }finally{
- //Downgrade by acquiring read lock before releasing write lock
- lock.readLock().lock();
- // Unlock write, still hold read
- lock.writeLock().unlock(); }
- }finally{
- lock.readLock().unlock();//最后一定不要忘記釋放鎖 System.out.println("get data key="+key+">val="+val);
- return val;
- static Object queryDataFromDB(Integer key){
- Object val=new Random().nextInt(1000);
- dataMap.put(key, val);
- System.out.println("write into data key="+key+">val="+val);
- return val;
- }
- public static void main(String[] args) {
- for(int i=0;i<10;i++){
- new Thread(new Runnable(){public void run() {
- getData(new Random().nextInt(5));
- }}).start(); }
- }
原文鏈接:http://www.cnblogs.com/cx361/archive/2011/12/14/2287025.html
【編輯推薦】