ホームページ  >  記事  >  Java  >  HashMap を使用して Java シングルトン モードでデータをキャッシュする方法

HashMap を使用して Java シングルトン モードでデータをキャッシュする方法

WBOY
WBOY転載
2023-05-13 09:43:141104ブラウズ

1. シングルトン パターンとは何ですか?

シングルトン モードは、オブジェクトの特定のインスタンスを生成するために使用されるオブジェクト作成モードであり、システム内のクラスのインスタンスが 1 つだけ生成されるようにすることができます。 Java で実装されたシングルトンは仮想マシンのスコープ内にあり、クラスをロードする機能は仮想マシンに属するため、仮想マシンは独自の ClassLoad を通じてシングルトン クラスをロードするときにクラスのインスタンスを作成します。 Java 言語では、このような動作により 2 つの大きな利点がもたらされます:

1. 頻繁に使用されるオブジェクトの場合、オブジェクトの作成に費やされる時間が省略できますが、これは、重量のあるオブジェクトにとっては非常に重要です。

##2. 新しい操作の数が減ると、システム メモリの使用頻度も減り、GC の圧力が軽減され、GC の一時停止時間が短縮されます。

したがって、システムの主要なコンポーネントや頻繁に使用されるオブジェクトに対して、シングルトン パターンを使用すると、システムのパフォーマンスを効果的に向上させることができます。シングルトン パターンの中核は、インターフェイスを通じて一意のオブジェクト インスタンスを返すことです。最初の問題は、インスタンスを作成する権限を取り戻し、クラス自体にそのクラスのインスタンスの作成を担当させ、その後、このクラスがこのクラスのインスタンスにアクセスするための外部メソッドを提供できるようにすることです。

2 . シングルトン パターンと HashMap を組み合わせてキャッシュを実装します

#1. テスト結果

HashMap を使用して Java シングルトン モードでデータをキャッシュする方法

#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;
    }
}

以上がHashMap を使用して Java シングルトン モードでデータをキャッシュする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。