package com.cache;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; public class MapCacheManager { private final static Log log = LogFactory.getLog(MapCacheManager.class); private volatile long updateTime = 0L;// 更新缓存时记录的时间 private volatile boolean updateFlag = true;// 正在更新时的阀门,为false时表示当前没有更新缓存,为true时表示当前正在更新缓存 private volatile static MapCacheManager mapCacheObject;// 缓存实例对象 private static Map<String, String> cacheMap = new ConcurrentHashMap<String, String>();// 缓存容器 private MapCacheManager() {
this.LoadCache();// 加载缓存
updateTime = System.currentTimeMillis();// 缓存更新时间 } /**
* 采用单例模式获取缓存对象实例
*
* @return
*/
public static MapCacheManager getInstance() {
if (null == mapCacheObject) {
synchronized (MapCacheManager.class) {
if (null == mapCacheObject) {
mapCacheObject = new MapCacheManager();
}
}
}
return mapCacheObject;
} /**
* 装载缓存
*/
private void LoadCache() { this.updateFlag = true;// 正在更新 /********** 数据处理,将数据放入cacheMap缓存中 **begin ******/
cacheMap.put("key1", "value1");
cacheMap.put("key2", "value2");
cacheMap.put("key3", "value3");
cacheMap.put("key4", "value4");
cacheMap.put("key5", "value5");
/********** 数据处理,将数据放入cacheMap缓存中 ***end *******/ this.updateFlag = false;// 更新已完成 } /**
* 返回缓存对象
*
* @return
*/
public Map<String, String> getMapCache() { long currentTime = System.currentTimeMillis(); if (this.updateFlag) {// 前缓存正在更新
log.info("cache is Instance .....");
return null; } if (this.IsTimeOut(currentTime)) {// 如果当前缓存正在更新或者缓存超出时限,需重新加载
synchronized (this) {
this.ReLoadCache();
this.updateTime = currentTime;
}
} return this.cacheMap;
} private boolean IsTimeOut(long currentTime) { return ((currentTime - this.updateTime) > );// 超过时限,超时
} /**
* 获取缓存项大小
* @return
*/
private int getCacheSize() {
return cacheMap.size();
} /**
* 获取更新时间
* @return
*/
private long getUpdateTime() {
return this.updateTime;
} /**
* 获取更新标志
* @return
*/
private boolean getUpdateFlag() {
return this.updateFlag;
} /**
* 重新装载
*/
private void ReLoadCache() {
this.cacheMap.clear();
this.LoadCache();
} }

测试实例:

package com.cache;

import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; public class CacheTest { public static void main(String[] args) { MapCacheManager cache = MapCacheManager.getInstance();
Map<String, String> cacheMap = new ConcurrentHashMap<String, String>(); cacheMap = cache.getMapCache();
Set<String> set = cacheMap.keySet();
Iterator<String> it = set.iterator(); while(it.hasNext()){
String key = it.next();
System.out.println(key+"="+cacheMap.get(key));
}
} }

HashMap实现缓存的更多相关文章

  1. HashMap实现缓存(二)

    package com.cache; import java.util.*; //Description: 管理缓存 //可扩展的功能:当chche到内存溢出时必须清除掉最早期的一些缓存对象,这就要求 ...

  2. HashMap的工作原理

    HashMap的工作原理   HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间 ...

  3. mybatis中的查询缓存

    一: 查询缓存 Mybatis提供查询缓存,用于减轻数据压力,提高数据库压力. Mybatis提供一级缓存和二级缓存. 在操作数据库时需要构造SqlSession对象,在对象中有一个数据结构(Hash ...

  4. Mybatis缓存处理机制

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  5. HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别

    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...

  6. JAVA hashmap知识整理

    HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题.HashMap的工作原理.ArrayList与Vect ...

  7. MyBatis入门学习教程-MyBatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了 package me.gacl.test; 2 import me.gacl.domain.User; import ...

  8. MyBatis学习总结(七)——Mybatis缓存(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...

  9. MyBatis学习总结(七)——Mybatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

随机推荐

  1. 从C++实现Ping开始说起

    在C++中实现ping功能,并不难.但真正了解ping是需要花费一番功夫的. Ping功能是在ICMP基础上实现的.IP协议并不是一个可靠的协议,它不保证数据被送达,那么,保证数据送达的工作应该由其他 ...

  2. cocos2d-js 学习笔记 --安装调试(1)

    目前从国内来看,比较知名的,适合前端程序员使用的游戏框架,基本是 egret 和cocos2d-js;刚好两个框架都学习了下, egret的是最近兴起的一个框架主要使用TypeScript.js语言做 ...

  3. [原创]用windows7连接windows2003的终端服务器时,出现"由于这台计算机没有远程桌面客户端访问许可证,远程会话被中断"的问题

    用windows7连接windows2003的终端服务器时,出现"由于这台计算机没有远程桌面客户端访问许可证,远程会话被中断"的问题,原因是终端服务器授权方式设置为了"每 ...

  4. 建表and新增删除数据A

    SELECT*FROM 表名:查询表 新建数据库: select 文件名(可以很多被查询的文件名)from 文件名 创建student表  CREATE TABLE `student`  ( `id` ...

  5. 用极简方式实现新浪新版本特性展示效果--view的图片轮播

    在发布版本的时候,大多数软件会在第一次使用新版本时候弹出视图用几张图片给用户做一个新版本特性介绍,最简单如下图新浪的版本特性介绍 由于图片是全屏展示且是左右滑动,大多数情况开发者会选择使用scroll ...

  6. Fedora 安装gcc gcc-c++

    Fedora本身没有自带gcc 和 g++编译器,所以需要我们自己去安装,步骤如下: 1.切换到root用户(或者跳过这个步骤,直接在下面命令前面加上 sudo) su root 2.安装gcc yu ...

  7. 实现滑动可固定header以及页面刷新

    用到的布局:SwiperRefreshLayout,AppBarLayout,ToolBar,CollapsingToolbarLayout,CoordinatorLayout 布局 <?xml ...

  8. Java Static关键字详解

    提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... 当然,不是所有人都像我一样学艺不精的 ...

  9. wifi的country code

    转自:http://userpage.chemie.fu-berlin.de/diverse/doc/ISO_3166.htmlCountry A 2 A 3 Number ------------- ...

  10. CSS系列:在HTML中引入CSS的方法

    HTML与CSS是两个作用不同的语言,它们同时对一个网页产生作用,因此必须将CSS与HTML链接在一起使用.在HTML中,引入CSS的方法主要有4种:行内式.内嵌式.导入式和链接式. 1. 行内式 行 ...