【问题标题】:How do I refresh singleton class object如何刷新单例类对象
【发布时间】:2020-02-18 19:22:50
【问题描述】:

我有一个像下面这样的单例类

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 的实例。如何在不使用反射的情况下刷新对象。 如果不是一个好的做法,我还能使用什么来确保我的地图仅在我的特定条件下刷新。 简而言之,我想在不使用反射或不重新启动服务器的情况下刷新我的缓存地图。

【问题讨论】:

  • 引入刷新的方法?

标签: java caching singleton refresh linkedhashmap


【解决方案1】:

你最好把你的单例写成简单的:'private static A a = new A();' – 这不会花费您任何费用(除非有人在他们的代码中引用 A ,否则不会调用它,然后它将在那个时间点被调用),并解决您的 sn-p 如何尝试的问题(错误地)尝试做一个单例。

为了刷新,好吧,只是..为此编写一个方法。不要锁定公开可见的东西(A.class 可以被所有代码寻址),这就像拥有公共字段一样。制作一个您锁定的私有对象。然后,有一个名为“getMap”的方法在这个私有锁上同步,还有一个名为“refreshMap”的方法也可以做到这一点。现在,任何调用 getMap 的代码,在刷新操作运行时,都会等到刷新操作完成,然后返回新制作的地图。如果地图为空,请自行调用刷新。所以,类似:

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 = ....;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2015-02-19
    • 2015-08-17
    • 1970-01-01
    相关资源
    最近更新 更多