Java单例模式利用HashMap实现缓存数据

网友投稿 279 2022-08-10


Java单例模式利用HashMap实现缓存数据

本文实例为大家分享了java单例模式利用HashMap实现缓存数据的具体代码,供大家参考,具体内容如下

一、单例模式是什么?

单例模式是一种对象创建模式,它用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。Java 里面实现的单例是一个虚拟机的范围,因为装载类的功能是虚拟机的,所以一个虚拟机在通过自己的 ClassLoad 装载实现单例类的时候就会创建一个类的实例。在 Java 语言中,这样的行为能带来两大好处:

1.对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销;

2.由于 new 操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻 GC 压力,缩短 GC 停顿时间。

因此对于系统的关键组件和被频繁使用的对象,使用单例模式可以有效地改善系统的性能。单例模式的核心在于通过一个接口返回唯一的对象实例。首要的问题就是要把创建实例的权限收回来,让类自身来负责自己类的实例的创建工作,然后由这个类来提供外部可以访问这个类实例的方法

二、单例模式结合HashMap实现缓存

1.测试结果

2.代码如下

JavaBean

public class People {

private String name;

private int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "People{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

缓存工具类

import java.util.HashMap;

import java.util.Map;

public class CacheSingletonUtil {

private static volatile CacheSingletonUtil cacheSingletonUtil;

private static Map cacheSingletonMap;

public static final String PEOPLE_LIST_KEY = "peopleList";

private CacheSingletonUtil(){

cacheSingletonMap = new HashMap();

}

/*

* 单例模式有两种类型

* 懒汉式:在真正需要使用对象时才去创建该单例类对象

* 饿汉式:在类加载时已经创建好该单例对象,等待被程序使用

*/

// 懒汉式单例模式

public static CacheSingletonUtil getInstance(){

if (cacheSingletonUtil == null){// 线程A和线程B同时看到cacheSingletonUtil = null,如果不为null,则直接返回cacheSingletonUtil

synchronized (CacheSingletonUtil.class) {// 线程A或线程B获得该锁进行初始化

if (cacheSingletonUtil == null) {// 其中一个线程进入该分支,另外一个线程则不会进入该分支

cacheSingletonUtil = new CacheSingletonUtil();

}

}

}

return cacheSingletonUtil;

}

/**

* 添加到内存

*/

public void addCacheData(String key,Object obj){

cacheSingletonMap.put(key,obj);

}

/**

* 从内存中取出

*/

public Object getCacheData(String key){

return cacheSingletonMap.get(key);

}

/**

* 从内存中清除

*/

public void removeCacheData(String key){

cacheSingletonMap.remove(key);

}

}

测试类

import org.apache.commons.collections.CollectionUtils;

import java.util.ArrayList;

import java.util.List;

public class CacheSingletonTest {

public static void main(String[] args) {

//测试查询

testQuery();

}

private static void testQuery () {

System.out.println("第一次查询开始");

query();

System.out.println("第一次nWWecbIe查询结束nWWecbIe");

System.out.println("=============");

System.out.println("第二次查询开始");

query();

System.out.println("第二次查询结束");

}

/*

* 查询数据

*/

private static List query() {

List peopleList = null;

List cacheData = (List) CacheSingletonUtil.getInstance().getCacheData(CacheSingletonUtil.PEOPLE_LIST_KEY);

if (CollectionUtils.isNotEmpty(cacheData)) {

System.out.println("从内存中读取");

peopleList = cacheData;

} else {

System.out.println("从数据库中读取");

peopleList = getData();

// 添加到内存中

http:// CacheSingletonUtil.getInstance().addCacheData(CacheSingletonUtil.PEOPLE_LIST_KEY, peopleList);

}

for (People people : peopleList) {

System.out.println("name : " + people.getName() + " age : " + people.getAge());

}

return peopleList;

}

/*

* 删除数据

*/

private void deleteCache () {

CacheSingletonUtil.getInstance().removeCacheData(CacheSingletonUtil.PEOPLE_LIST_KEY);

}

private static List getData() {

People p1 = new People();

p1.setName("Jack");

p1.setAge(25);

People p2 = new People();

p2.setName("Brown");

p2.setAge(28);

List peopleList = new ArrayList<>();

peopleList.add(p1);

peopleList.add(p2);

return peopleList;

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Hashmap非线程安全关于hash值冲突处理(hashmap线程不安全以及解决办法)
下一篇:Java实现按比例缩小图片(java怎么把图片等比例缩小)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~