Java单例模式怎么利用HashMap实现缓存数据
导读:本文共2589.5字符,通常情况下阅读需要9分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 一、单例模式是什么?单例模式是一种对象创建模式,它用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。Java 里面实现的单例是一个虚拟机的范围,因为装载类的功能是虚拟机的,所以一个虚拟机在通过自己的 ClassLoad 装载实现单例类的时候就会创建一个类的实例。在 Java 语言中,这样的行为能带来两大好处:1.对于频繁使用的对象,可以省略创建对... ...
目录
(为您整理了一些要点),点击可以直达。一、单例模式是什么?
单例模式是一种对象创建模式,它用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。Java 里面实现的单例是一个虚拟机的范围,因为装载类的功能是虚拟机的,所以一个虚拟机在通过自己的 ClassLoad 装载实现单例类的时候就会创建一个类的实例。在 Java 语言中,这样的行为能带来两大好处:
1.对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销;
2.由于 new 操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻 GC 压力,缩短 GC 停顿时间。
因此对于系统的关键组件和被频繁使用的对象,使用单例模式可以有效地改善系统的性能。单例模式的核心在于通过一个接口返回唯一的对象实例。首要的问题就是要把创建实例的权限收回来,让类自身来负责自己类的实例的创建工作,然后由这个类来提供外部可以访问这个类实例的方法
二、单例模式结合HashMap实现缓存
1.测试结果
2.代码如下
JavaBean
publicclassPeople{privateStringname;privateintage;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}@OverridepublicStringtoString(){return"People{"+"name='"+name+'\''+",age="+age+'}';}}
缓存工具类
importjava.util.HashMap;importjava.util.Map;publicclassCacheSingletonUtil{privatestaticvolatileCacheSingletonUtilcacheSingletonUtil;privatestaticMap<String,Object>cacheSingletonMap;publicstaticfinalStringPEOPLE_LIST_KEY="peopleList";privateCacheSingletonUtil(){cacheSingletonMap=newHashMap<String,Object>();}/**单例模式有两种类型*懒汉式:在真正需要使用对象时才去创建该单例类对象*饿汉式:在类加载时已经创建好该单例对象,等待被程序使用*///懒汉式单例模式publicstaticCacheSingletonUtilgetInstance(){if(cacheSingletonUtil==null){//线程A和线程B同时看到cacheSingletonUtil=null,如果不为null,则直接返回cacheSingletonUtilsynchronized(CacheSingletonUtil.class){//线程A或线程B获得该锁进行初始化if(cacheSingletonUtil==null){//其中一个线程进入该分支,另外一个线程则不会进入该分支cacheSingletonUtil=newCacheSingletonUtil();}}}returncacheSingletonUtil;}/***添加到内存*/publicvoidaddCacheData(Stringkey,Objectobj){cacheSingletonMap.put(key,obj);}/***从内存中取出*/publicObjectgetCacheData(Stringkey){returncacheSingletonMap.get(key);}/***从内存中清除*/publicvoidremoveCacheData(Stringkey){cacheSingletonMap.remove(key);}}
测试类
importorg.apache.commons.collections.CollectionUtils;importjava.util.ArrayList;importjava.util.List;publicclassCacheSingletonTest{publicstaticvoidmain(String[]args){//测试查询testQuery();}privatestaticvoidtestQuery(){System.out.println("第一次查询开始");query();System.out.println("第一次查询结束");System.out.println("=============");System.out.println("第二次查询开始");query();System.out.println("第二次查询结束");}/**查询数据*/privatestaticList<People>query(){List<People>peopleList=null;List<People>cacheData=(List<People>)CacheSingletonUtil.getInstance().getCacheData(CacheSingletonUtil.PEOPLE_LIST_KEY);if(CollectionUtils.isNotEmpty(cacheData)){System.out.println("从内存中读取");peopleList=cacheData;}else{System.out.println("从数据库中读取");peopleList=getData();//添加到内存中CacheSingletonUtil.getInstance().addCacheData(CacheSingletonUtil.PEOPLE_LIST_KEY,peopleList);}for(Peoplepeople:peopleList){System.out.println("name:"+people.getName()+"age:"+people.getAge());}returnpeopleList;}/**删除数据*/privatevoiddeleteCache(){CacheSingletonUtil.getInstance().removeCacheData(CacheSingletonUtil.PEOPLE_LIST_KEY);}privatestaticList<People>getData(){Peoplep1=newPeople();p1.setName("Jack");p1.setAge(25);Peoplep2=newPeople();p2.setName("Brown");p2.setAge(28);List<People>peopleList=newArrayList<>();peopleList.add(p1);peopleList.add(p2);returnpeopleList;}}
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
Java单例模式怎么利用HashMap实现缓存数据的详细内容,希望对您有所帮助,信息来源于网络。