編輯:我已經找到了單例的構造函數被多次調用,所以它看起來類正在被不同的類加載器多次加載。我如何在Tomcat中創建一個全球單身人士?我一直在使用谷歌搜索,但目前還沒有運氣。在多線程Tomcat服務器中訪問全局變量
我有一個單獨的對象,我喜歡構造從而:
private static volatile KeyMapper mapper = null;
public static KeyMapper getMapper()
{
if(mapper == null)
{
synchronized(Utils.class)
{
if(mapper == null)
{
mapper = new LocalMemoryMapper();
}
}
}
return mapper;
}
類KeyMapper基本上是一個同步包裝僅具有兩個功能是HashMap,一次加映射和一個刪除的映射。當我在32位Windows機器上運行Tomcat 6.24時,一切正常。但是,當在64位Linux機器上運行(CentOS 5.4,OpenJDK 1.6.0-b09)時,我添加一個映射並打印出KeyMapper使用的HashMap的大小,以驗證添加的映射(即驗證大小= 1)。然後我嘗試用另一個請求來檢索映射,並且我一直收到null,並且當我檢查HashMap的大小時它是0.我相信映射不會意外地被刪除,因爲我已經註釋掉所有要刪除的調用(並且我不使用清晰的或任何其他的增變器,只是得到並放置)。
請求正在通過Tomcat 6.24(配置爲使用至少4個線程的200個線程),並且我將-Xnoclassgc傳遞給jvm以確保類不會無意中收集垃圾(jvm也在運行 - 服務器模式)。我還爲KeyMapper添加了一個finalize方法,如果垃圾收集器確認它沒有被垃圾收集,就會打印到stderr。
我在我束手無策,我想不通,爲什麼一分鐘HashMap中的條目是存在的,接下來它不是:(
我認爲你的bug是在其他地方。 – 2010-05-03 12:32:36