最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java單例模式利用HashMap實(shí)現(xiàn)緩存數(shù)據(jù)

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

本文實(shí)例為大家分享了Java單例模式利用HashMap實(shí)現(xiàn)緩存數(shù)據(jù)的具體代碼,供大家參考,具體內(nèi)容如下

一、單例模式是什么?

單例模式是一種對(duì)象創(chuàng)建模式,它用于產(chǎn)生一個(gè)對(duì)象的具體實(shí)例,它可以確保系統(tǒng)中一個(gè)類(lèi)只產(chǎn)生一個(gè)實(shí)例。Java 里面實(shí)現(xiàn)的單例是一個(gè)虛擬機(jī)的范圍,因?yàn)檠b載類(lèi)的功能是虛擬機(jī)的,所以一個(gè)虛擬機(jī)在通過(guò)自己的 ClassLoad 裝載實(shí)現(xiàn)單例類(lèi)的時(shí)候就會(huì)創(chuàng)建一個(gè)類(lèi)的實(shí)例。在 Java 語(yǔ)言中,這樣的行為能帶來(lái)兩大好處:

1.對(duì)于頻繁使用的對(duì)象,可以省略創(chuàng)建對(duì)象所花費(fèi)的時(shí)間,這對(duì)于那些重量級(jí)對(duì)象而言,是非??捎^(guān)的一筆系統(tǒng)開(kāi)銷(xiāo);

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

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

二、單例模式結(jié)合HashMap實(shí)現(xiàn)緩存

1.測(cè)試結(jié)果

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 +
? ? ? ? ? ? ? ? '}';
? ? }
}

緩存工具類(lèi)

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>();
? ? }

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

? ? // 懶漢式單例模式
? ? public static CacheSingletonUtil getInstance(){
? ? ? ? if (cacheSingletonUtil == null){// 線(xiàn)程A和線(xiàn)程B同時(shí)看到cacheSingletonUtil = null,如果不為null,則直接返回cacheSingletonUtil
? ? ? ? ? ? synchronized (CacheSingletonUtil.class) {// 線(xiàn)程A或線(xiàn)程B獲得該鎖進(jìn)行初始化
? ? ? ? ? ? ? ? if (cacheSingletonUtil == null) {// 其中一個(gè)線(xiàn)程進(jìn)入該分支,另外一個(gè)線(xiàn)程則不會(huì)進(jìn)入該分支
? ? ? ? ? ? ? ? ? ? cacheSingletonUtil = new CacheSingletonUtil();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return cacheSingletonUtil;
? ? }

? ? /**
? ? ?* 添加到內(nèi)存
? ? ?*/
? ? public void addCacheData(String key,Object obj){
? ? ? ? cacheSingletonMap.put(key,obj);
? ? }

? ? /**
? ? ?* 從內(nèi)存中取出
? ? ?*/
? ? public Object getCacheData(String key){
? ? ? ? return cacheSingletonMap.get(key);
? ? }

? ? /**
? ? ?* 從內(nèi)存中清除
? ? ?*/
? ? public void removeCacheData(String key){
? ? ? ? cacheSingletonMap.remove(key);
? ? }

}

測(cè)試類(lèi)

import org.apache.commons.collections.CollectionUtils;
import java.util.ArrayList;
import java.util.List;

public class CacheSingletonTest {

? ? public static void main(String[] args) {
? ? ? ? //測(cè)試查詢(xún)
? ? ? ? testQuery();
? ? }

? ? private static void testQuery () {
? ? ? ? System.out.println("第一次查詢(xún)開(kāi)始");
? ? ? ? query();
? ? ? ? System.out.println("第一次查詢(xún)結(jié)束");

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

? ? ? ? System.out.println("第二次查詢(xún)開(kāi)始");
? ? ? ? query();
? ? ? ? System.out.println("第二次查詢(xún)結(jié)束");
? ? }

? ? /*
? ? ?* 查詢(xún)數(shù)據(jù)
? ? ?*/
? ? 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("從內(nèi)存中讀取");
? ? ? ? ? ? peopleList = cacheData;
? ? ? ? } else {
? ? ? ? ? ? System.out.println("從數(shù)據(jù)庫(kù)中讀取");
? ? ? ? ? ? peopleList = getData();
? ? ? ? ? ? // 添加到內(nèi)存中
? ? ? ? ? ? CacheSingletonUtil.getInstance().addCacheData(CacheSingletonUtil.PEOPLE_LIST_KEY, peopleList);
? ? ? ? }

? ? ? ? for (People people : peopleList) {
? ? ? ? ? ? System.out.println("name : " + people.getName() + " age : " + people.getAge());
? ? ? ? }

? ? ? ? return peopleList;
? ? }

? ? /*
? ? ?* 刪除數(shù)據(jù)
? ? ?*/
? ? 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;
? ? }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java后端向前端返回文件流實(shí)現(xiàn)下載功能

    Java后端向前端返回文件流實(shí)現(xiàn)下載功能

    后端可以使用Java中servlet提供的HttpServletResponse,核心步驟是要設(shè)置響應(yīng)的數(shù)據(jù)類(lèi)型,設(shè)置為某一類(lèi)文件類(lèi)型或二進(jìn)制格式,以及響應(yīng)頭,然后用ServletOutputStream將文件以流的形式發(fā)送到前端,本文介紹Java后端向前端返回文件流實(shí)現(xiàn)下載功能,感興趣的朋友一起看看吧
    2023-12-12
  • java中Websocket的使用方法例子

    java中Websocket的使用方法例子

    這篇文章主要給大家介紹了關(guān)于java中Websocket的使用方法,WebSocket是HTML5開(kāi)始提供的一種在瀏覽器和服務(wù)器間進(jìn)行全雙工通信的協(xié)議,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 基于Mybatis-Plus攔截器實(shí)現(xiàn)MySQL數(shù)據(jù)加解密的示例代碼

    基于Mybatis-Plus攔截器實(shí)現(xiàn)MySQL數(shù)據(jù)加解密的示例代碼

    用戶(hù)的一些敏感數(shù)據(jù),例如手機(jī)號(hào)、郵箱、身份證等信息,在數(shù)據(jù)庫(kù)以明文存儲(chǔ)時(shí)會(huì)存在數(shù)據(jù)泄露的風(fēng)險(xiǎn),因此需要進(jìn)行加密,解密等功能,接下來(lái)本文就給大家介紹基于Mybatis-Plus攔截器實(shí)現(xiàn)MySQL數(shù)據(jù)加解密,需要的朋友可以參考下
    2023-07-07
  • Springboot自動(dòng)配置原理及DataSource的應(yīng)用方式

    Springboot自動(dòng)配置原理及DataSource的應(yīng)用方式

    這篇文章主要介紹了Springboot自動(dòng)配置原理及DataSource的應(yīng)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Jpa中Specification的求和sum不生效原理分析

    Jpa中Specification的求和sum不生效原理分析

    這篇文章主要為大家介紹了Jpa中Specification的求和sum不生效原理示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java算法真題詳解運(yùn)用單調(diào)棧

    Java算法真題詳解運(yùn)用單調(diào)棧

    一般使用單調(diào)棧無(wú)非兩個(gè)方向,單調(diào)遞減,單調(diào)遞增。單調(diào)遞增棧:存進(jìn)去的數(shù)據(jù)都是增加的,碰到減少的時(shí)候,這時(shí)就要進(jìn)行操作了。單調(diào)遞減棧:存進(jìn)去的數(shù)據(jù)都是減少的,碰到增加的時(shí)候,這時(shí)就要進(jìn)行操作了,下面我們?cè)谡骖}中運(yùn)用它
    2022-07-07
  • 使用Rhino讓java執(zhí)行javascript的方法實(shí)例

    使用Rhino讓java執(zhí)行javascript的方法實(shí)例

    這篇文章主要介紹了java使用Rhino執(zhí)行javascript的方法,Rhino由Mozilla開(kāi)發(fā),是 JavaScript 一種基于Java的實(shí)現(xiàn)
    2013-12-12
  • Java關(guān)于BeabUtils.copyproperties的用法

    Java關(guān)于BeabUtils.copyproperties的用法

    這篇文章主要介紹了Java關(guān)于BeabUtils.copyproperties的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 淺談Java編程中的單例設(shè)計(jì)模式

    淺談Java編程中的單例設(shè)計(jì)模式

    這篇文章主要介紹了Java編程中的單例設(shè)計(jì)模式,在許多語(yǔ)言的編程過(guò)程當(dāng)中單例模式都被開(kāi)發(fā)者們廣泛采用,需要的朋友可以參考下
    2015-07-07
  • java面向?qū)ο缶幊填?lèi)的內(nèi)聚性分析

    java面向?qū)ο缶幊填?lèi)的內(nèi)聚性分析

    高內(nèi)聚、低耦合是軟件設(shè)計(jì)中非常關(guān)鍵的概念。在面向?qū)ο蟪绦蛟O(shè)計(jì)中類(lèi)的劃分時(shí),類(lèi)的內(nèi)聚性越高,其封裝性越好,越容易復(fù)用
    2021-10-10

最新評(píng)論

淮滨县| 应城市| 星座| 柳江县| 五常市| 庆阳市| 离岛区| 武平县| 湛江市| 阿合奇县| 禹城市| 铜山县| 博客| 明水县| 健康| 丹凤县| 蒙阴县| 五大连池市| 习水县| 巍山| 无棣县| 滦南县| 武胜县| 侯马市| 海宁市| 织金县| 西藏| 文安县| 桑日县| 乌兰浩特市| 芒康县| 大埔区| 古交市| 纳雍县| 蒙阴县| 大田县| 万山特区| 周至县| 阿合奇县| 陇川县| 通山县|