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. json 构造和解析

    目录: (1)引入jar包: (2)json的构造: (3)json的解析: (4)遍历未知key. (1)java对json的处理,可借助org.json.jar. <!-- https:// ...

  2. Android源码阅读 – Zygote

    @Dlive 本文档: 使用的Android源码版本为:Android-4.4.3_r1 kitkat (源码下载: http://source.android.com/source/index.ht ...

  3. VC++ : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>

    最近学习Google Breakpad,将其用在了自己的项目中,编译的版本为VS2010,没有什么问题.但是为了和之前的程序兼容,需要使用VS2008版本的程序,于是又编译了VS2008版本的代码,但 ...

  4. Ruby数组

    Ruby数组是有序的,任何对象的整数索引的集合.每个数组中的元素相关联,并提取到的一个索引.下标与C或Java相似,从0开始.负数索引假设数组末尾,也就是说-1表示最后一个元素的数组索引,-2是数组中 ...

  5. JDBC的操作总结

    JDBC  操作总结 JDBC是一组能够执行SQL语句的API JDBC的操作方式比较单一,简单的分为以下几个流程:  1.通过数据库厂商提供的JDB类库想DriverManager注册数据库驱动   ...

  6. GroupBy(..)的四种声明方式的理解及调用

    这里我们以 List<Student> studs作为 source,但是注意,studs中的学生可以是分别属于不同的班级和年级 先看GroupBy的第一种声明: public stati ...

  7. 【笔记】MySQL查询排名

    select a.name, a.total_score,@rank:=@rank+1 as rank from (                  select u.name,uti.total_ ...

  8. head标签详细讲解

    head标签详细讲解 head位于html网页的头部,后前的标签,并以开始以结束的一html标签. Head标签位置如图: head标签示意图 head包含标签 meta,title,link,bas ...

  9. 那些年,坑死自己的事之fread/fwrite

    今天继续看牛人做过的东西,这个小程序并不大,加上相当多的注释行,才5000多行.这个小程序是在linux下实现的,之前自己也一直用vi来看并加以更加详细的注释,但是效率实在太低.于是将其转移到wind ...

  10. 安装Impala

    1.默认安装好hadoop并且能正常启动(只需hdfs即可)2.安装如下rpm包(需要root权限 注意顺序) bigtop-utils-0.7.0+cdh5.8.2+0-1.cdh5.8.2.p0. ...