Perché le variabili Java ThreadLocal dovrebbero essere statiche

Stavo leggendo il JavaDoc per Threadlocal qui

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ThreadLocal.html

e dice “Le istanze ThreadLocal sono in genere campi statici privati ​​in classi che desiderano associare lo stato a un thread (ad esempio, un ID utente o ID transazione).”

Ma la mia domanda è perché hanno scelto di renderlo statico (in genere) – rende le cose un po ‘confuse per avere lo stato “per thread” ma i campi sono statici?

Perché se fosse un campo a livello di istanza, sarebbe in realtà “Per Thread – Per istanza”, non solo un “Per Thread” garantito. Normalmente non è la semantica che stai cercando.

Di solito è in possesso di qualcosa come oggetti che sono finalizzati a una conversazione utente, richiesta Web, ecc. Non li si vuole anche sottoambito dell’istanza della class.
Una richiesta web => una sessione di persistenza.
Nessuna richiesta web => una sessione di persistenza per object.

O rendilo statico o se stai cercando di evitare qualsiasi campo statico nella tua class – rendi la class stessa un singleton e poi puoi tranquillamente usare il livello di istanza ThreadLocal finché hai quel singleton disponibile a livello globale.

Non deve essere. L’importante è che dovrebbe essere un singleton.

Il motivo è che le variabili sono accessibili tramite un puntatore associato al thread. Agiscono come variabili globali con ambito thread, quindi la staticità è la soluzione più adatta. Questo è il modo in cui si ottiene lo stato locale del thread in cose come pthreads, quindi questo potrebbe essere solo un incidente di storia e implementazione.

Un uso per un threadlocal su una istanza per thread è se si desidera che qualcosa sia visibile in tutti i metodi di un object e che sia thread-safe senza sincronizzare l’accesso ad esso come si farebbe per un campo ordinario.

Fare riferimento a questo , questo dà una migliore comprensione.

In breve, ThreadLocal object ThreadLocal funziona come una mappa valore-chiave. Quando il thread richiama il ThreadLocal get/set ThreadLocal , recupera / archivia l’object thread nella chiave della mappa e il valore nel valore della mappa. Ecco perché thread diversi hanno copie di valore diverse (che vuoi archiviare localmente), perché risiedono nella voce di una mappa diversa.

Ecco perché hai bisogno di una sola mappa per mantenere tutti i valori. Sebbene non sia necessario, è ansible avere più mappe (senza dichiarare statiche) per mantenere anche ciascun object thread, il che, essendo completamente ridondante, è il motivo per cui è preferibile la variabile statica.