Współbieżność języka Java - klasa ThreadLocal
Klasa ThreadLocal służy do tworzenia zmiennych lokalnych wątku, które mogą być odczytywane i zapisywane tylko przez ten sam wątek. Na przykład, jeśli dwa wątki uzyskują dostęp do kodu mającego odwołanie do tej samej zmiennej threadLocal, to każdy wątek nie zobaczy żadnej modyfikacji zmiennej threadLocal wykonanej przez inny wątek.
ThreadLocal Methods
Poniżej znajduje się lista ważnych metod dostępnych w klasie ThreadLocal.
Sr.No. | Metoda i opis |
---|---|
1 | public T get() Zwraca wartość w kopii tej zmiennej lokalnej wątku w bieżącym wątku. |
2 | protected T initialValue() Zwraca „wartość początkową” bieżącego wątku dla tej zmiennej lokalnej wątku. |
3 | public void remove() Usuwa bieżącą wartość wątku dla tej zmiennej lokalnej wątku. |
4 | public void set(T value) Ustawia kopię bieżącego wątku tej zmiennej lokalnej wątku na określoną wartość. |
Przykład
Poniższy program TestThread demonstruje niektóre z tych metod klasy ThreadLocal. Tutaj użyliśmy dwóch zmiennych licznikowych, jedna to normalna zmienna, a druga to ThreadLocal.
class RunnableDemo implements Runnable {
int counter;
ThreadLocal<Integer> threadLocalCounter = new ThreadLocal<Integer>();
public void run() {
counter++;
if(threadLocalCounter.get() != null) {
threadLocalCounter.set(threadLocalCounter.get().intValue() + 1);
} else {
threadLocalCounter.set(0);
}
System.out.println("Counter: " + counter);
System.out.println("threadLocalCounter: " + threadLocalCounter.get());
}
}
public class TestThread {
public static void main(String args[]) {
RunnableDemo commonInstance = new RunnableDemo();
Thread t1 = new Thread(commonInstance);
Thread t2 = new Thread(commonInstance);
Thread t3 = new Thread(commonInstance);
Thread t4 = new Thread(commonInstance);
t1.start();
t2.start();
t3.start();
t4.start();
// wait for threads to end
try {
t1.join();
t2.join();
t3.join();
t4.join();
} catch (Exception e) {
System.out.println("Interrupted");
}
}
}
Spowoduje to następujący wynik.
Wynik
Counter: 1
threadLocalCounter: 0
Counter: 2
threadLocalCounter: 0
Counter: 3
threadLocalCounter: 0
Counter: 4
threadLocalCounter: 0
Możesz zobaczyć, że wartość counter jest zwiększana przez każdy wątek, ale threadLocalCounter pozostaje 0 dla każdego wątku.