2011-12-18 13 views
1

いくつかの変数を格納するためにInheritableThreadLocalを使用します。だから私はこのようないくつかのコードを書いた:NullPointerExceptionが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がnull値を返したように見えます。しかし、getContextではnullを返すことはできません。 getがnullを返すと、新しいものが作成されるためです。

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

これまでにこの問題が発生したことはありますか?または任意のアイデア?

答えて

2

私は、これはあなたの問題を修正するが、これを書くための明確な方法は、これはあなたがスレッドローカル値を初期化するサポートされている方法を使用する意味します

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"); 
} 

であるかどうかわからないです。

+1

+1コードをスレッドセーフにするためです。 OPのコードは2つの異なるマップを2つのスレッドに返すことができます。しかし、私は彼がNPEを得る方法を見ていない。 –

+0

@JBNizet合意しましたが、彼が何かをしているなら、彼はそれを置き換えるべきではないと言っています。 –

+0

@PeterLawreyあなたの提案をありがとう。私はまたLinkedHashMapを使う理由を知りたいですか? – crabhit

関連する問題