【问题标题】: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 = ....;
}
}
}