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; ? ? } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot?SpringSecurity?JWT實現系統(tǒng)安全策略詳解
Spring?Security是Spring的一個核心項目,它是一個功能強大且高度可定制的認證和訪問控制框架。它提供了認證和授權功能以及抵御常見的攻擊,它已經成為保護基于spring的應用程序的事實標準2022-11-11JAVA對list集合進行排序Collections.sort()
這篇文章主要介紹了JAVA對list集合進行排序Collections.sort(),需要的朋友可以參考下2017-01-01