即使應用程序使用緩存線程池,是否還需要在服務器環境中部署某個線程時調用remove方法?線程本地刪除方法
public static ThreadLocal<Integer> i = new ThreadLocal<Integer>(){{
public Integer initialValue(){return 3;}
};
即使應用程序使用緩存線程池,是否還需要在服務器環境中部署某個線程時調用remove方法?線程本地刪除方法
public static ThreadLocal<Integer> i = new ThreadLocal<Integer>(){{
public Integer initialValue(){return 3;}
};
理論上,如果Thread
和ThreadLocal
仍在運行,則該值將可到達。如果兩者中的任何一個都無法訪問,那麼在理論上,如果不引用該值,則該值是垃圾回收。但是,OpenJDK中存在一個錯誤,這意味着如果該值引用ThreadLocal
(令人驚訝的常見),和Thread
仍在運行,則會發生泄漏。
所以,從某種意義上說,服務器環境沒有什麼特別之處。但是,通常在開發過程中重複加載代碼的地方,通常情況下,ThreadLocal
可以從值(值到類的值到class-loader-of-the-class到all-classes-通過類加載器永久加載到這些類的靜態字段爲ThreadLocal
)。 Java Beans和JDBC的實現可能有類似的問題。
...一個線程消失之後,所有的線程局部實例的副本都會被垃圾收集...
如果線程仍然可能在周圍,並且您希望解除資源引用,那麼最好致電remove()
。
聽起來像你可能想考慮使用一個簡單的局部變量,如果你想清除它。
如果你有一個緩存線程池,線程可能會或可能不會消失。 –