Параллелизм Java - класс ThreadLocal
Класс ThreadLocal используется для создания локальных переменных потока, которые могут быть прочитаны и записаны только одним потоком. Например, если два потока обращаются к коду, имеющему ссылку на одну и ту же переменную threadLocal, каждый поток не увидит никаких изменений в переменной threadLocal, выполненных другим потоком.
ThreadLocal методы
Ниже приводится список важных методов, доступных в классе ThreadLocal.
Sr. No. | Метод и описание |
---|---|
1 | public T get() Возвращает значение в копии текущего потока этой локальной переменной потока. |
2 | protected T initialValue() Возвращает «начальное значение» текущего потока для этой локальной переменной потока. |
3 | public void remove() Удаляет значение текущего потока для этой локальной переменной потока. |
4 | public void set(T value) Устанавливает копию текущего потока этой локальной переменной потока в указанное значение. |
пример
Следующая программа TestThread демонстрирует некоторые из этих методов класса ThreadLocal. Здесь мы использовали две переменные-счетчики, одна из которых является нормальной переменной, а другая - 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");
}
}
}
Это даст следующий результат.
Вывод
Counter: 1
threadLocalCounter: 0
Counter: 2
threadLocalCounter: 0
Counter: 3
threadLocalCounter: 0
Counter: 4
threadLocalCounter: 0
Вы можете видеть, что значение счетчика увеличивается каждым потоком, но threadLocalCounter остается 0 для каждого потока.