Учебники

Параллелизм Java – класс ThreadLocal

Класс ThreadLocal используется для создания локальных переменных потока, которые могут быть прочитаны и записаны только одним потоком. Например, если два потока обращаются к коду, имеющему ссылку на одну и ту же переменную threadLocal, то каждый поток не увидит никаких изменений в переменной threadLocal, выполненных другим потоком.

ThreadLocal Методы

Ниже приведен список важных методов, доступных в классе ThreadLocal.

Sr.No. Метод и описание
1

public T get ()

Возвращает значение в копии текущего потока этой локальной переменной потока.

2

Защищенный T initialValue ()

Возвращает «начальное значение» текущего потока для этой локальной переменной потока.

3

public void remove ()

Удаляет значение текущего потока для этой локальной переменной потока.

4

открытый набор пустот (значение T)

Устанавливает копию текущего потока этой локальной переменной потока в указанное значение.

public T get ()

Возвращает значение в копии текущего потока этой локальной переменной потока.

Защищенный T initialValue ()

Возвращает «начальное значение» текущего потока для этой локальной переменной потока.

public void remove ()

Удаляет значение текущего потока для этой локальной переменной потока.

открытый набор пустот (значение T)

Устанавливает копию текущего потока этой локальной переменной потока в указанное значение.

пример

Следующая программа TestThread демонстрирует некоторые из этих методов класса ThreadLocal. Здесь мы использовали две переменные счетчика, одна из которых является нормальной переменной, а другая – ThreadLocal.

Live Demo

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 для каждого потока.