2012-11-06 10 views
5

È necessario chiamare remove su un thread locale se non si sta distribuendo in un ambiente server, anche se l'app utilizza un pool di thread memorizzato nella cache?metodo locale di rimozione thread

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

risposta

2

In teoria, se entrambi gli apparecchi Thread e ThreadLocal sono ancora in riproduzione, il valore sarà raggiungibile. Se entrambi sono irraggiungibili, in teoria, il valore è spazzatura raccoglibile se diversamente non referenziato. Tuttavia, c'è un bug in OpenJDK che significa che se il valore fa riferimento allo ThreadLocal (sorprendentemente comune) e lo Thread è ancora in esecuzione, verrà perso.

Quindi sì, in un certo senso, non c'è niente di speciale in un ambiente server. Tuttavia, generalmente quando si ripete il codice di ricarica durante lo sviluppo, spesso accade che lo ThreadLocal sia raggiungibile dal valore (valore alla classe del valore a class-loader-of-the-class a tutte le classi- caricatore sempre-through-class-class in campi-statici di quelle classi in un ThreadLocal). Le implementazioni di Java Beans e JDBC potrebbero avere problemi simili.

5

Come per il javadoc for ThreadLocal:

... dopo un filo va via, tutte le sue copie di istanze thread-locali sono soggette a garbage collection ...

Se il thread potrebbe ancora essere in giro e si desidera che la risorsa sia stata deferita, è meglio chiamare remove().


Sembra che si desideri prendere in considerazione l'utilizzo di una semplice variabile locale se si desidera eliminarlo.

+0

Se si dispone di un pool di thread nella cache, i thread potrebbero non andare via. –

Problemi correlati