1. 程式人生 > >java怎樣將資料儲存到快取中,之後再儲存

java怎樣將資料儲存到快取中,之後再儲存

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();//建立讀寫鎖的例項 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(); } } }