2012-11-06 11 views
5

Czy należy wywoływać usuwanie w wątku lokalnym, jeśli nie jest wdrażane w środowisku serwera, nawet jeśli aplikacja używa buforowanej puli wątków?Metoda usuwania lokalnego wątku

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

Odpowiedz

2

Teoretycznie, jeśli zarówno Thread, jak i ThreadLocal są nadal w grze, wartość będzie osiągalna. Jeśli którykolwiek z nich jest nieosiągalny, teoretycznie wartość jest zbiorem śmieci, jeśli nie ma żadnych odniesień. Istnieje jednak błąd w OpenJDK, co oznacza, że ​​jeśli wartość odnosi się do ThreadLocal (zaskakująco często) i, to Thread nadal działa, to wycieknie.

Tak, w pewnym sensie, nie ma nic szczególnego w środowisku serwera. Jednak generalnie w przypadku wielokrotnego ponownego wczytywania kodu podczas programowania często jest tak, że ThreadLocal jest osiągalny od wartości (wartość do klasy wartości do klasy-ładowarka klasy do wszystkich klas- kiedykolwiek ładowany przez klasę-ładowarkę do statycznych pól tej klasy do ThreadLocal). Implementacje Java Beans i JDBC mogą mieć podobne problemy.

5

Jak na javadoc for ThreadLocal:

... po wątek odchodzi, wszystkie jej kopie instancji wątku lokalnego podlegają zbierania śmieci ...

Jeśli wątek nadal może znajdować się w pobliżu i chcesz, aby zasób został odwołany, lepiej zadzwoń pod numer remove().


Wygląda na to, że warto rozważyć użycie prostej zmiennej lokalnej, jeśli chcesz ją wyczyścić.

+0

Jeśli masz buforowaną pulę wątków, wątki mogą lub nie mogą zniknąć. –

Powiązane problemy