我已經宣佈枚舉,這是什麼樣子(並非真正的代碼)鎖定與更新直接
public enum MySession {
INSTANCE;
MySession() {
loadFactory();
}
public void refreshMyFactory() {
//Is it OK to call "loadFactory" here as-is, or should I worry about concurrency
}
private void loadFactory() {
MyFactory factory = null;
try {
//Initialize factory by doing some IO.
} catch (final Exception exception) {
//Handle Exception
} finally {
myFactory = factory;
//If NULL, log FATAL exception...
}
}
private MyFactory myFactory;
/**
* @return the sessionFactory
*/
public MyFactory getMyFactory() {
return myFactory;
}
}
有可能訪問MySession.INSTANCE.getMyFactory多線程()和使用工廠。 工廠通過從輸入流中讀取文件來創建。
用例是我需要以編程方式刷新此工廠。
問題:
有沒有辦法鎖定對工廠的訪問,直到它被更新?這會有多混亂?
可以簡單地更新工廠,沒有任何鎖定。這樣做的含義是什麼?
雖然彼得的答案相當簡潔,但我會接受這個答案,因爲它提供了一種更簡單的方式來處理更新,而不使用volatile。 – Serendipity