[英]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.