Jsf 2 JSF通用实体转换器不是线程安全的

Jsf 2 JSF通用实体转换器不是线程安全的,jsf-2,Jsf 2,我已经使用著名的entityConverter很长时间了,但今天我意识到这不是线程安全的,它可能会产生并发错误 如果一个线程在散列中添加一个元素,而另一个线程同时读取散列,则会抛出java.util.ConcurrentModificationException异常 有人能证实这个问题吗?谢谢 转换器代码:取自BalusC post @FacesConverter(value=“entityConverter”) 公共类EntityConverter实现转换器{ 私有静态映射实体=new Wea

我已经使用著名的entityConverter很长时间了,但今天我意识到这不是线程安全的,它可能会产生并发错误

如果一个线程在散列中添加一个元素,而另一个线程同时读取散列,则会抛出java.util.ConcurrentModificationException异常

有人能证实这个问题吗?谢谢

转换器代码:取自BalusC post

@FacesConverter(value=“entityConverter”)
公共类EntityConverter实现转换器{
私有静态映射实体=new WeakHashMap();
@凌驾
公共字符串getAsString(FacesContext上下文、UIComponent组件、对象实体){
已同步(实体){
如果(!entities.containsKey(实体)){
字符串uuid=uuid.randomUUID().toString();
实体。put(实体,uuid);
返回uuid;
}否则{
返回实体。获取(实体);
}
}
}
@凌驾
公共对象getAsObject(FacesContext上下文、UIComponent组件、字符串uuid){
for(条目:entities.entrySet()){
if(entry.getValue().equals(uuid)){
return entry.getKey();
}
}
返回null;
}
}

很抱歉,我没有意识到这条评论的延迟,我在生产环境中发现了这个问题。如果一个线程在散列中添加一个元素,而另一个线程同时读取散列,则会抛出java.util.ConcurrentModificationException异常,如我所说。如果我的评论听起来粗鲁,也许是因为我的英语生疏,我只是想展示和讨论一个问题。
@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;
    }

}