Исключение NullPointerException может быть связано с InheritableThreadLocal - PullRequest
1 голос
/ 18 декабря 2011

Я хочу использовать InheritableThreadLocal для хранения некоторых переменных.Поэтому я написал такой код:

public class ThreadContext
{
    private static ThreadLocal current = new InheritableThreadLocal();

    public static HashMap getContext()
    {
        if (current.get() == null) {
            createContext();
        }
        return (HashMap) current.get();
    }

    public static void createNewContext(){
        createContext();
    }

    public static IClientContext getClientContext()
    {
        return (IClientContext) ThreadContext.getContext().get("CLIENT_CONTEXT");
    }

    public static void setClientContext(IClientContext ctx) {
        ThreadContext.getContext().put("CLIENT_CONTEXT", ctx);
    }

    private static void createContext()
    {
        current.set(new HashMap());
    }
}

Но когда другой код вызывает getClientContext, иногда возникает NullPointerException:

java.lang.NullPointerException
    at com.xxx.util.ThreadContext.getClientContext(ThreadContext.java:19)

Похоже, что getContext вернул нулевое значение.Но в getContext он не может вернуть ноль.Потому что, если get возвращает null, он создаст новый.

public static HashMap getContext()
{
    if (current.get() == null) {
        createContext();
    }
    return (HashMap) current.get();
}

Кто-нибудь сталкивался с этой проблемой раньше?Или есть идеи?

1 Ответ

2 голосов
/ 18 декабря 2011

Я не уверен, что это решит вашу проблему, но более ясный способ написать это:

public class ThreadContext {
private static ThreadLocal<Map<String, IClientContext>>  current = new InheritableThreadLocal<Map<String, IClientContext>>() {
    protected Map<String, IClientContext> initialValue() {
         return new LinkedHashMap<String, IClientContext>();
    }
};

public static IClientContext getClientContext(){
    return ThreadContext.getContext().get("CLIENT_CONTEXT");
}

Это будет означать, что вы используете поддерживаемый способ инициализации локального значения потока.

...