2012-11-06 29 views
5

即使應用程序使用緩存線程池,是否還需要在服務器環境中部署某個線程時調用remove方法?線程本地刪除方法

public static ThreadLocal<Integer> i = new ThreadLocal<Integer>(){{ 
    public Integer initialValue(){return 3;} 
}; 

回答

2

理論上,如果ThreadThreadLocal仍在運行,則該值將可到達。如果兩者中的任何一個都無法訪問,那麼在理論上,如果不引用該值,則該值是垃圾回收。但是,OpenJDK中存在一個錯誤,這意味着如果該值引用ThreadLocal(令人驚訝的常見),Thread仍在運行,則會發生泄漏。

所以,從某種意義上說,服務器環境沒有什麼特別之處。但是,通常在開發過程中重複加載代碼的地方,通常情況下,ThreadLocal可以從值(值到類的值到class-loader-of-the-class到all-classes-通過類加載器永久加載到這些類的靜態字段爲ThreadLocal)。 Java Beans和JDBC的實現可能有類似的問題。

5

由於每javadoc for ThreadLocal

...一個線程消失之後,所有的線程局部實例的副本都會被垃圾收集...

如果線程仍然可能在周圍,並且您希望解除資源引用,那麼最好致電remove()


聽起來像你可能想考慮使用一個簡單的局部變量,如果你想清除它。

+0

如果你有一個緩存線程池,線程可能會或可能不會消失。 –