Deux raisons pour lesquelles ThreadLocal ne peut pas obtenir de valeur

1. Deux raisons

  • Le premier et le plus courant est que plusieurs threads utilisent ThreadLocal
  • La seconde est que différents chargeurs de classes ne provoquent l’obtention de valeur. La raison essentielle est que différents chargeurs de classes génèrent plusieurs objets ThreadLocal.
public class StaticClassLoaderTest {
    
    
    protected static final ThreadLocal<Object> local = new ThreadLocal<Object>();
    //cusLoader加载器加载的对象
    private Test3 test3;

    public StaticClassLoaderTest() {
    
    
        try {
    
    
            test3 = (Test3) Class.forName("gittest.Test3", true, new cusLoader()).newInstance();
        }
        catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }
    public Test3 getTest3() {
    
    
        return test3;
    }
    public static void main(String[] args) {
    
    
        try {
    
    
            //默认类加载器加载StaticClassLoaderTest,并设置值
            StaticClassLoaderTest.local.set(new Object());
            new StaticClassLoaderTest().getTest3();
        }
        catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }
    //自定义类加载器
    public static class cusLoader extends ClassLoader {
    
    
        @Override
        protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
    
    
            if (name.contains("StaticClassLoaderTest")) {
    
    
                InputStream is = Thread.currentThread().getContextClassLoader()
                        .getResourceAsStream(name.replace(".", "/") + ".class");
                ByteArrayOutputStream output = new ByteArrayOutputStream();
                try {
    
    
                    IOUtils.copy(is, output);
                    return defineClass(output.toByteArray(), 0, output.toByteArray().length);
                }
                catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
            return super.loadClass(name, resolve);
        }
    }

}
public class Test3 {
    
    

    public void test() {
    
    
        //由cusLoader加载器加载StaticClassLoaderTest,并获取值,由于StaticClassLoaderTest并不相同所以无法获取到值
        System.out.println(StaticClassLoaderTest.local.get());
    }
}

2. Résumé

  • Les objets chargés par les deux accumulateurs référencent la même variable statique ThreadLocal. En fait, ThreadLocal n'a pas la même valeur, donc même dans un thread, la valeur attendue ne peut pas être obtenue.
  • Comme l'injection de dépendances, si vous créez un objet vous-même, puis injectez manuellement une dépendance créée par un conteneur, en supposant que cette dépendance est créée par un additionneur de classe personnalisé, cela peut provoquer cette situation.

Je suppose que tu aimes

Origine blog.csdn.net/TheThirdMoon/article/details/109624711
conseillé
Classement