有这样一个类:造成死锁
------------------------------------------------------------------------------------------
package com.chl.dps.util;import java.util.Hashtable;
import java.util.Map;import com.cathaypacific.vcm.content.subclass.Glossary;
import com.chl.dps.vo.Language;public class GlossaryUtil { private Hashtable glossaryHash = new Hashtable(); private static GlossaryUtil _instance = null; private GlossaryUtil() {
} public static synchronized GlossaryUtil getInstance() {
if (_instance == null) {
_instance = new GlossaryUtil();
}
return _instance;
} public synchronized void resetCache() {
glossaryHash = new Hashtable();
} public String get(String title, String locale, String msgName) {
Map localeMap = get(title, locale, false);
if (localeMap != null) {
String value = (String) localeMap.get(msgName);
if (value != null) {
return value;
}
}
localeMap = get(title, Language.getLangCode(locale));
if (localeMap != null) {
String value = (String) localeMap.get(msgName);
if (value != null) {
return value;
}
}
return null;
} public Map get(String title, String locale) {
return get(title, locale, true);
} public Map get(String title, String locale, boolean defaultLang) { Glossary glossary = get(title);
if (glossary == null) {
return null;
}
Map localeMap = glossary.getGlossary(locale);
if (defaultLang && localeMap == null) {
localeMap = glossary.getGlossary(Language.DEFAULT);
}
return localeMap;
} public Glossary get(String key) {
if (!contains(key)) {
put(key, load(key));
}
return (Glossary) glossaryHash.get(key);
} private synchronized boolean contains(Object key) {
return glossaryHash.containsKey(key);
} private synchronized void put(Object key, Glossary value) {
if (value != null) {
glossaryHash.put(key, value);
}
} public synchronized void remove(String title) {
glossaryHash.remove(title);
} private synchronized Glossary load(String title) {
return ContentUtil.findGlossary(title);
} /**
 * Match a string pattern and replace with the replacement string
 * in the inputted text
 * <p>
 * @param pat matching string pattern
 * @param rep replacement string
 * @param ori original text
 * @return string after replacement
 */
public static String replace(String pat, String rep, String ori) { StringBuffer sb;
if (rep == null) {
rep = "";
}
if (ori != null) {
if (pat != null) {
int count = 0;
int i, j; for (i = 0;
(i = ori.indexOf(pat, i)) != -1;
i += pat.length()) {
++count;
}
sb =
new StringBuffer(
ori.length() + count * (rep.length() - pat.length()));
for (i = 0;
(j = ori.indexOf(pat, i)) != -1;
i = j + pat.length()) {
sb.append(ori.substring(i, j)).append(rep);
}
sb.append(ori.substring(i));
} else {
return ori;
}
} else {
return "";
}
return sb.toString();
}}
------------------------------------------------------------------------------------------
因为占用资源而导致High JVM损耗,
3XMTHREADINFO      "WebContainer : 127" (TID:0x8073D208, sys_thread_t:0x45D44228, state:CW, native ID:0x80AE) prio=5
4XESTACKTRACE          at com.chl.dps.util.GlossaryUtil.load(GlossaryUtil.java(Compiled Code))
4XESTACKTRACE          at com.chl.dps.util.GlossaryUtil.get(GlossaryUtil.java(Compiled Code))
4XESTACKTRACE          at com.chl.dps.util.GlossaryUtil.get(GlossaryUtil.java(Compiled Code))
4XESTACKTRACE          at com.chl.dps.util.GlossaryUtil.get(GlossaryUtil.java(Compiled Code))
4XESTACKTRACE          at com.chl.dps.util.GlossaryUtil.get(GlossaryUtil.java(Compiled Code))
4XESTACKTRACE          at com.chl.dps.util.HtmlUtil.printPackageHighlightAltText(HtmlUtil.java(Compiled Code))
4XESTACKTRACE          at com.chl.dps.util.HtmlUtil.printPkgList_HightLightIcons(HtmlUtil.java(Compiled Code))
4XESTACKTRACE          at com.ibm._jsp._v4_5F_promotion_5F_list_5F_landing_5F_page._jspService(_v4_5F_promotion_5F_list_5F_landing_5F_page.java(Compiled Code
))
------------------------------------------------------------------------------------------
各位有什么好建议修改这个类?