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

时间:2013-05-29 16:14:04

标签: jsf-2

我一直在使用famouse entityConverter,但今天我意识到这不是线程安全的,它可以产生并发错误。

如果一个线程在Hash中添加了一个元素,而另一个线程同时读取了哈希值,那么将抛出一个java.util.ConcurrentModificationException异常

有人可以证实这个问题吗?感谢

转换器代码:取自BalusC帖子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;
    }

}

0 个答案:

没有答案