欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java單例模式利用HashMap實現緩存數據

 更新時間:2022年04月22日 11:42:54   作者:在下令狐  
這篇文章主要為大家詳細介紹了Java單例模式利用HashMap實現緩存數據,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Java單例模式利用HashMap實現緩存數據的具體代碼,供大家參考,具體內容如下

一、單例模式是什么?

單例模式是一種對象創(chuàng)建模式,它用于產生一個對象的具體實例,它可以確保系統(tǒng)中一個類只產生一個實例。Java 里面實現的單例是一個虛擬機的范圍,因為裝載類的功能是虛擬機的,所以一個虛擬機在通過自己的 ClassLoad 裝載實現單例類的時候就會創(chuàng)建一個類的實例。在 Java 語言中,這樣的行為能帶來兩大好處:

1.對于頻繁使用的對象,可以省略創(chuàng)建對象所花費的時間,這對于那些重量級對象而言,是非??捎^的一筆系統(tǒng)開銷;

2.由于 new 操作的次數減少,因而對系統(tǒng)內存的使用頻率也會降低,這將減輕 GC 壓力,縮短 GC 停頓時間。

因此對于系統(tǒng)的關鍵組件和被頻繁使用的對象,使用單例模式可以有效地改善系統(tǒng)的性能。單例模式的核心在于通過一個接口返回唯一的對象實例。首要的問題就是要把創(chuàng)建實例的權限收回來,讓類自身來負責自己類的實例的創(chuàng)建工作,然后由這個類來提供外部可以訪問這個類實例的方法

二、單例模式結合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>();
? ? }

? ? /*
? ? ?* 單例模式有兩種類型
? ? ?* 懶漢式:在真正需要使用對象時才去創(chuàng)建該單例類對象
? ? ?* 餓漢式:在類加載時已經創(chuàng)建好該單例對象,等待被程序使用
? ? ?*/

? ? // 懶漢式單例模式
? ? 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;
? ? }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Spring Boot實現分布式鎖的自動釋放的示例代碼

    Spring Boot實現分布式鎖的自動釋放的示例代碼

    在實際開發(fā)中,我們可以使用 Redis、Zookeeper 等分布式系統(tǒng)來實現分布式鎖,本文將介紹如何使用 Spring Boot 來實現分布式鎖的自動釋放,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • Java 面試題和答案 - (下)

    Java 面試題和答案 - (下)

    本文主要介紹Java 面試題,這里整理了Java面試題關于JDBC,線程異常處理,Servlet,JSP的知識的整理,幫助大家理解知識點,便于面試,有興趣的小伙伴可以參考下
    2016-09-09
  • SpringBoot配置文件的加載位置實例詳解

    SpringBoot配置文件的加載位置實例詳解

    springboot采納了建立生產就緒spring應用程序的觀點。 在一些特殊的情況下,我們需要做修改一些配置,或者需要有自己的配置屬性。接下來通過本文給大家介紹SpringBoot配置文件的加載位置,感興趣的朋友一起看看吧
    2018-09-09
  • Java中程序的運行全過程

    Java中程序的運行全過程

    這篇文章主要介紹了Java中程序的運行全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 詳解如何給Sprintboot應用添加插件機制

    詳解如何給Sprintboot應用添加插件機制

    這篇文章主要為大家介紹了如何給 Sprintboot 應用添加插件機制,文中有詳細的解決方案及示例代碼,具有一定的參考價值,需要的朋友可以參考下
    2023-08-08
  • SpringBoot?SpringSecurity?JWT實現系統(tǒng)安全策略詳解

    SpringBoot?SpringSecurity?JWT實現系統(tǒng)安全策略詳解

    Spring?Security是Spring的一個核心項目,它是一個功能強大且高度可定制的認證和訪問控制框架。它提供了認證和授權功能以及抵御常見的攻擊,它已經成為保護基于spring的應用程序的事實標準
    2022-11-11
  • JAVA對list集合進行排序Collections.sort()

    JAVA對list集合進行排序Collections.sort()

    這篇文章主要介紹了JAVA對list集合進行排序Collections.sort(),需要的朋友可以參考下
    2017-01-01
  • mybatis-plus動態(tài)表名的實現示例

    mybatis-plus動態(tài)表名的實現示例

    這篇文章主要介紹了mybatis-plus動態(tài)表名的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • Java中鎖的實現和內存語義淺析

    Java中鎖的實現和內存語義淺析

    這篇文章主要給大家介紹了關于Java中鎖的實現和內存語義的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • spring boot springMVC擴展配置實現解析

    spring boot springMVC擴展配置實現解析

    這篇文章主要介紹了spring boot springMVC擴展配置實現解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08

最新評論