早上好, 我目前正在開發一個公開Web服務接口的Java Web應用程序。爲了保持一個全局對象在內存中,我用下面的類作爲一個Singleton:Java Web服務中的單例對象
public class SingletonMap {
private static final SingletonMap instance = new SingletonMap();
private static HashMap couponMap = null;
private static long creationTime;
private SingletonMap() {
creationTime = System.currentTimeMillis();
couponMap = new HashMap();
}
public static synchronized SingletonMap getInstance() {
return instance;
}
public static long getCreationTime() {
return creationTime;
}
}
我纔能有HashMap中的同一個實例爲Web服務的所有線程使用上述類。即保持SingletonMap對象的Web服務類如下:
@WebService()
public class ETL_WS {
private String TOMCAT_TEMP_DIR;
private final int BUFFER_SIZE = 10000000;
private static SingletonMap couponMap;
private static SingletonProductMap productCategoryMap;
private String dbTable = "user_preferences";
public ETL_WS() {
Context context = null;
try {
context = (Context) new InitialContext().lookup("java:comp/env");
this.TOMCAT_TEMP_DIR = (String) context.lookup("FILE_UPLOAD_TEMP_DIR");
}catch(NamingException e) {
System.err.println(e.getMessage());
}
public long getCouponMapCreationTime() {
return couponMap.getCreationTime();
}
}
因爲我這方法getCouponMapCreationTime()是檢查Web服務的所有線程都訪問同一個對象。上述方法是否正確?性能開銷如何?你認爲我需要Singleton屬性,還是我可以爲所有線程使用靜態HashMap?如果我使用靜態HashMap,在沒有線程處於活動狀態時是否會收集垃圾?
謝謝你的時間。
我明白了。如果客戶端請求之間有很大的停頓,該對象是否會被垃圾收集,或者不是?我的意思是,如果Web服務空閒一段時間,JVM是否運行垃圾回收器並清理我的實例?對不起,如果我很煩人,但我是這個領域的新手,並且我從未部署過帶有持久內存(RAM)對象的Web服務。 –
不,對象將永遠不會被垃圾收集,因爲框架保留對它的引用。這些類型的框架(servlet,jaxws等)總是保留服務對象的單個實例,但它們實際創建/銷燬的是線程(使用線程池策略)。但不要擔心,這不會影響您的內存共享數據! – ggarciao
謝謝ggarciao。你的快速回答幫了我很多。 –