簡體   English   中英

如何刷新 singleton class object

[英]How do I refresh singleton class object

我有一個 singleton class 如下所示

class A{

private volatile static  A a;
//declaration of LinkedHashMap

private A(){
//lot of code that puts values in the map
}

public static A getInstance() {
        if (a== null) {
            synchronized (A.class) {
                if (a== null) {
                    a = new A();
                }
            }
        } 
        return a;
    }

}

我想在某些特定條件下刷新 A 的實例。 如何在不使用反射的情況下刷新 object。 如果不是一個好的做法,我還能用什么來確保我的 map 僅在我的特定條件下刷新。 簡而言之,我想在不使用反射或不重新啟動服務器的情況下刷新緩存的 map。

你最好把你的 singleton 寫成簡單的:'private static A a = new A();' – 這不會花費您任何費用(除非有人在其代碼中的某處引用 A,否則不會調用它,然后將在該時間點調用它),並解決您的代碼段如何嘗試(錯誤地)的問題嘗試制作 singleton。

為了刷新,好吧,只需..為此編寫一個方法。 不要鎖定公開可見的東西(A.class 可以通過所有代碼尋址),這就像擁有公共字段一樣。 制作一個您鎖定的私有 object。 然后,有一個名為“getMap”的方法在這個私有鎖上同步,還有一個名為“refreshMap”的方法也可以做到這一點。 現在,任何調用 getMap 的代碼在刷新操作運行時都會等待刷新操作完成,然后返回新生成的 map。 如果 map 是 null,請致電刷新。 所以,像:

public class A {
    private static final A INSTANCE = new A();
    private LinkedHashMap<Integer, String> map;
    private final Object locker = new Object();
    private A() {}

    public static A getInstance() {
        return INSTANCE; // Look how simple this got!
    }

    public Map<Integer, String> getMap() {
        synchronized (locker) {
            if (map == null) refresh();
            return map;
        }
    }

    public void refresh() {
        synchronized (locker) {
            // refresh map here...
            map = ....;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM