程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 更新-最近學習java的緩存機制,請大家看看我的代碼有什麼不足

更新-最近學習java的緩存機制,請大家看看我的代碼有什麼不足

編輯:編程綜合問答
最近學習java的緩存機制,請大家看看我的代碼有什麼不足

一個簡單的測試類,如果在高並發下會有問題麼

 package com.test.cache;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class CacheManager {

    private volatile static CacheManager cacheManager;//緩存類的實例

    private long upDataTime;//最後一次更新的時間

    private static Map<Object,Object> cacheMap = new ConcurrentHashMap<Object,Object>();//緩存容器

    private boolean upDataStatus;//緩存狀態,true為正在更新,false為更新完畢

    private CacheManager(){
        upDataTime = System.currentTimeMillis();
    }

    /**
     * 初始化,保證單例
     * @return
     */
    public static CacheManager getInstance(){
        if(cacheManager == null){
            synchronized(CacheManager.class){
                if(cacheManager == null){
                    cacheManager = new CacheManager();
                }
            }
        }
        return cacheManager;
    }

    /**
     * 載入數據
     */
    public void loadAllCache(){
        upDataStatus = true;
        /*****************************/ //模擬從數據庫取數據,放入map
        cacheMap.put("1", 1);
        cacheMap.put("2", 2);
        cacheMap.put("3", 3);
        cacheMap.put("4", 4);
        /*****************************/
        upDataStatus = false;
    }

    /**
     * 返回緩存
     * @return
     */
    public Map<Object,Object> getCache(){
        long currentTime = System.currentTimeMillis();
        boolean isTimeOut = isTimeOut(currentTime);
        if(upDataStatus){
            System.out.println("當前緩存正在更新,不可取值");
            return null;
        }
        if(isTimeOut){
            System.out.println("當前緩存已超時,正在重新獲取");
            this.upDataTime = System.currentTimeMillis();
            this.reloadCache();//重新獲取
        }
        return cacheMap;
    }

    /**
     * 判斷是否超時
     * @param currentTime
     * @return
     */
    private boolean isTimeOut(long currentTime){
        return (currentTime-this.upDataTime > 100000 ? true :false);
    }

    /**
     * 重新載入緩存
     */
    private void reloadCache(){
        this.cacheMap.clear();
        this.loadAllCache();
    }
}

最佳回答:


高並發需要考慮伸縮性,也就是多個服務器同時處理,那麼需要進程之前的數據同步,而不是僅僅同步線程。你的程序沒有什麼實際的作用哦。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved