91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java項目中ThreadLocal無法取值的原因有哪些

發布時間:2020-11-18 14:52:19 來源:億速云 閱讀:559 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關java項目中ThreadLocal無法取值的原因有哪些,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

1.兩種原因

第一種,也是最常見的一種,就是多個線程使用ThreadLocal

第二種,類加載器不同造成取不到值,本質原因就是不同類加載器造成多個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<&#63;> 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.總結

2個累加器加載的對象引用了相同的靜態變量ThreadLocal,實際上ThreadLocal并不是同一個值,所以即使在一個線程中也獲取不到期望的值。

像依賴注入,如果你自己創建了一個對象,然后用手動注入了一個容器創建的依賴,假設這個依賴是自定義類加器創建的,可能會造成這種情況。

看完上述內容,你們對java項目中ThreadLocal無法取值的原因有哪些有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

凉山| 呼伦贝尔市| 塘沽区| 安多县| 同江市| 泾阳县| 沾益县| 桂阳县| 剑阁县| 西华县| 河津市| 墨竹工卡县| 萨嘎县| 额尔古纳市| 吴江市| 桂林市| 巢湖市| 香河县| 峡江县| 弥勒县| 富裕县| 宁陵县| 璧山县| 武功县| 巴青县| 鲁甸县| 叙永县| 宣汉县| 襄城县| 胶州市| 丰镇市| 巴林右旗| 奎屯市| 大兴区| 台东县| 宜良县| 纳雍县| 许昌市| 杭锦旗| 利津县| 叙永县|