我一直在使用着名的 entityConverter,但今天我意识到这不是线程安全的,它会产生并发错误。
如果一个线程在 Hash 中添加一个元素,另一个线程同时读取该 hash,则会抛出 java.util.ConcurrentModificationException 异常
有人可以确认这个问题吗?谢谢
转换器代码:取自 BalusC post Generic JSF entity converter
@FacesConverter(value="entityConverter")
public class EntityConverter implements Converter {
private static Map<Object, String> entities = new WeakHashMap<Object, String>();
@Override
public String getAsString(FacesContext context, UIComponent component, Object entity) {
synchronized (entities) {
if (!entities.containsKey(entity)) {
String uuid = UUID.randomUUID().toString();
entities.put(entity, uuid);
return uuid;
} else {
return entities.get(entity);
}
}
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String uuid) {
for (Entry<Object, String> entry : entities.entrySet()) {
if (entry.getValue().equals(uuid)) {
return entry.getKey();
}
}
return null;
}
}