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();
}
これまでにこの問題が発生したことはありますか?または任意のアイデア?
+1コードをスレッドセーフにするためです。 OPのコードは2つの異なるマップを2つのスレッドに返すことができます。しかし、私は彼がNPEを得る方法を見ていない。 –
@JBNizet合意しましたが、彼が何かをしているなら、彼はそれを置き換えるべきではないと言っています。 –
@PeterLawreyあなたの提案をありがとう。私はまたLinkedHashMapを使う理由を知りたいですか? – crabhit