Java单例模式利用HashMap实现缓存数据
作者:在下令狐 发布时间:2021-12-15 20:21:42
标签: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<String,Object> cacheSingletonMap;
public static final String PEOPLE_LIST_KEY = "peopleList";
private CacheSingletonUtil(){
cacheSingletonMap = new HashMap<String, Object>();
}
/*
* 单例模式有两种类型
* 懒汉式:在真正需要使用对象时才去创建该单例类对象
* 饿汉式:在类加载时已经创建好该单例对象,等待被程序使用
*/
// 懒汉式单例模式
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("第一次查询结束");
System.out.println("=============");
System.out.println("第二次查询开始");
query();
System.out.println("第二次查询结束");
}
/*
* 查询数据
*/
private static List<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 (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<People> getData() {
People p1 = new People();
p1.setName("Jack");
p1.setAge(25);
People p2 = new People();
p2.setName("Brown");
p2.setAge(28);
List<People> peopleList = new ArrayList<>();
peopleList.add(p1);
peopleList.add(p2);
return peopleList;
}
}
来源:https://blog.csdn.net/yang353933546/article/details/108296693
0
投稿
猜你喜欢
- 文件切割和文件合并这个问题困扰了我有一段时间了(超过一天没做粗来)。找了好多博客,本来想转载一个来的 结果找不到了。很无奈。只好自己贴代码上
- 目录1、什么是Java的内存模型2、为什么需要Java内存模型3、Java内存模型及操作规范4、Java内存模型规定的原子操作5、Java内
- spring 容器的创建对应 SpringApplication 中 run 中调用的 createApplicationContext 方
- 前言 随着Java生态愈发庞大,各种各样的新技术层出不穷,这也给大家的学习带来了很多困惑,这么多技术我该学什么,盲目的在各种新技术间
- 1、实现这里主要用的是反射的方法。用户要传入方法名和方法参数,我们就需要先写函数返回这些信息,最后再包装一下返回给用户。获取某一程序集下所有
- 本文实例讲述了C#实现翻转字符串的方法。分享给大家供大家参考。具体实现方法如下:Func<string, string> Rev
- 引用Spring官方文档的说法介绍一下@Conditional注解:Spring5.0.15版本@Conditional注解官方文档@Con
- 一、MVVM 和 MVVMLight介绍MVVM是Model-View-ViewModel的简写。类似于目前比较流行的MVC、MVP设计模式
- 自用项目中统一Eclipse格式化Java、JavaScript、JSP、HTML代码设置1.Window->Preferences
- 本文实例为大家分享了Java执行SQL脚本文件到数据库的具体方式,供大家参考,具体内容如下方式一:直接读取SQL脚本文件的内容,然后传递到S
- lombok插件使用引入依赖,在项目中使用Lombok可以减少很多重复代码的书写。比如说getter/setter/toString等方法的
- java 数据结构中栈和队列的实例详解栈和队列是两种重要的线性数据结构,都是在一个特定的范围的存储单元中的存储数据。与线性表相比,它们的插入
- 什么是POM?POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做p
- 1.使用WINDOWS API/// <summary> /// 判断一个磁盘驱动器的类型 /// </summary&g
- C# 中没有四舍五入函数,程序语言都没有四舍五入函数,因为四舍五入算法不科学,国际通行的是 Banker 舍入法Bankers roundi
- ssm(spring springMVC mybatis)1.创建项目file->new->project2.新建的maven项
- 1. 源码阅读环境搭建ide:IntelliJ IDEA 2020.1包管理:gradleeureka版本:1.10.11Spring Cl
- 本文实例为大家分享了Android Studio实现简易计算器App的具体代码,供大家参考,具体内容如下效果演示布局文件<?xml v
- 一个android文件的Uri地址一般如下: content://media/external/images/media/62026这是一张
- 1.添加依赖直接添加 hibernate-validator<dependency> &n