如何刷新单例 class 对象
How do I refresh singleton class object
我有一个单例 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 的实例。如何在不使用反射的情况下刷新对象。
如果不是一个好的做法,我还能用什么来确保我的地图只在我的特定条件下得到刷新。
简而言之,我想在不使用反射或不重新启动服务器的情况下刷新特定条件下的缓存地图。
你最好把你的单身人士写成简单的:'private static A a = new A();' – 这不会花费你任何东西(它不会被调用,除非有人在他们的代码中引用 A,然后它会在那个时间点调用),并修复了您的代码片段如何尝试(错误地)尝试创建单例的问题。
为了刷新,好吧,只是..为此写一个方法。不要锁定 public 可见的东西(A.class 可以通过所有代码寻址),这就像拥有 public 字段一样。制作一个您锁定的私有对象。然后,有一个名为 'getMap' 的方法在这个私有锁上同步,还有一个名为 'refreshMap' 的方法也这样做。现在任何调用 getMap 的代码,当刷新操作为 运行 时,将等待刷新操作完成,然后 return 新制作的地图。如果地图为空,请自行调用刷新。所以,像这样:
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 = ....;
}
}
}
我有一个单例 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 的实例。如何在不使用反射的情况下刷新对象。 如果不是一个好的做法,我还能用什么来确保我的地图只在我的特定条件下得到刷新。 简而言之,我想在不使用反射或不重新启动服务器的情况下刷新特定条件下的缓存地图。
你最好把你的单身人士写成简单的:'private static A a = new A();' – 这不会花费你任何东西(它不会被调用,除非有人在他们的代码中引用 A,然后它会在那个时间点调用),并修复了您的代码片段如何尝试(错误地)尝试创建单例的问题。
为了刷新,好吧,只是..为此写一个方法。不要锁定 public 可见的东西(A.class 可以通过所有代码寻址),这就像拥有 public 字段一样。制作一个您锁定的私有对象。然后,有一个名为 'getMap' 的方法在这个私有锁上同步,还有一个名为 'refreshMap' 的方法也这样做。现在任何调用 getMap 的代码,当刷新操作为 运行 时,将等待刷新操作完成,然后 return 新制作的地图。如果地图为空,请自行调用刷新。所以,像这样:
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 = ....;
}
}
}