gpt4 book ai didi

java - 如何刷新单例类对象

转载 作者:行者123 更新时间:2023-12-02 09:23:29 25 4
gpt4 key购买 nike

我有一个如下所示的单例类

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

最佳答案

你最好将你的单例写成简单的:'private static A a = new A();' – 这不会花费你任何费用(除非有人在代码中引用 A,否则它不会被调用,然后它将在那个时间点被调用),并修复这里的代码片段如何尝试(错误地)的问题尝试创建一个单例。

为了刷新,好吧,只是......为此编写一个方法。不要锁定公开可见的事物(A.class 可由所有代码寻址),这就像拥有公共(public)字段一样。创建一个您锁定的私有(private)对象。然后,有一个名为“getMap”的方法在该私有(private)锁上进行同步,以及一个名为“refreshMap”的方法也执行此操作。现在,在刷新操作运行时调用 getMap 的任何代码都将等待刷新操作完成,然后返回新制作的 map 。如果 map 为空,请自行刷新。所以,类似于:

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

关于java - 如何刷新单例类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58507718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com