Java數(shù)據(jù)緩存實(shí)現(xiàn)的核心機(jī)制
在大數(shù)據(jù)量訪問(wèn)讀取中,數(shù)據(jù)緩存是最普遍采用的解決方案之一,但在讀過(guò)很多代碼的緩存實(shí)現(xiàn),代碼可圈可點(diǎn)的彈性都很大,在一并發(fā)數(shù)不多時(shí),功能是完全沒(méi)有問(wèn)題的,但是對(duì)大數(shù)量的多并發(fā)操作上就有些差強(qiáng)人意了。以下為集數(shù)家之長(zhǎng)實(shí)現(xiàn)的數(shù)據(jù)緩存核心機(jī)制代碼片段,以拋磚引玉,供大家學(xué)習(xí),此片段的核心代碼參考sun的源碼實(shí)現(xiàn)。
sun沒(méi)有對(duì)此段代碼開放,它的功能在ArrayBlockingQueue(jdk1.5)中已經(jīng)實(shí)現(xiàn)并提供開放接口。沒(méi)有時(shí)間看下面的代碼的可直接查看ArrayBlockingQueue的api,如果對(duì)象ArrayBlockingQueue也沒(méi)有興趣的同學(xué),可以直接調(diào)用ConcurrentHashMap(jdk1.5), ConcurrentSkipListMap(jdk1.6),這些類,api中有更加祥細(xì)的說(shuō)明,這里不多說(shuō),需要注意的是因?yàn)榇斯δ芙鉀Q多線程并發(fā)問(wèn)題,故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)建讀寫鎖的實(shí)例
- 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
【編輯推薦】