Spec-Zone.ru › OpenJDK 8

Класс ThreadLocal<T>

  • java.lang.Object
    • java.lang.ThreadLocal<T>
Прямые известные подклассы:
InheritableThreadLocal

public class ThreadLocal<T>
extends Object

Этот класс предоставляет переменные, локальные для потока. Эти переменные отличаются от обычных тем, что каждый поток, который обращается к одной из них (через метод get или set), имеет свою собственную, независимо инициализированную копию переменной. ThreadLocal обычно являются частными статическими полями в классах, которые хотят связать состояние с потоком (например, идентификатор пользователя или идентификатор транзакции).

Например, класс ниже генерирует уникальные идентификаторы, локальные для каждого потока. Идентификатор потока назначается в первый раз при вызове ThreadId.get() и остается неизменным при последующих вызовах.

import java.util.concurrent.atomic.AtomicInteger;

 public class ThreadId {
     // Atomic integer containing the next thread ID to be assigned
     private static final AtomicInteger nextId = new AtomicInteger(0);

     // Thread local variable containing each thread's ID
     private static final ThreadLocal<Integer> threadId =
         new ThreadLocal<Integer>() {
             @Override protected Integer initialValue() {
                 return nextId.getAndIncrement();
         }
     };

     // Returns the current thread's unique ID, assigning it if necessary
     public static int get() {
         return threadId.get();
     }
 }

Каждый поток содержит неявную ссылку на свою копию переменной, локальной для потока, пока поток жив и экземпляр ThreadLocal доступен; после того, как поток завершится, все его копии экземпляров, локальных для потока, подлежат сборке мусора (если не существует других ссылок на эти копии).

С:
1.2

Конструкторы

Конструктор и описание
ThreadLocal()

Создает локальную переменную потока.

Методы

Модификатор и тип Метод и описание
T get()

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

protected T initialValue()

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

void remove()

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

void set(T value)

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

static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier)

Создаёт локальную переменную потока.

Методы, унаследованные от класса java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Конструкторы

ThreadLocal

public ThreadLocal()

Создаёт локальную переменную потока.

См. также:
withInitial(java.util.function.Supplier)

Методы

initialValue

protected T initialValue()

Возвращает "начальное значение" текущего потока для этой локальной переменной потока. Этот метод будет вызываться в первый раз, когда поток обращается к переменной с помощью метода get(), если поток ранее не вызывал метод set(T), в этом случае метод initialValue для потока не будет вызываться. Обычно этот метод вызывается не более одного раза на поток, но он может быть вызван снова в случае последующих вызовов remove() за которым следует get().

Эта реализация просто возвращает null; если программист хочет, чтобы локальные переменные потоков имели начальное значение, отличное от null, необходимо создать подкласс ThreadLocal и переопределить этот метод. Обычно используется анонимный внутренний класс.

Возвращает:
начальное значение для этой локальной переменной потока

withInitial

public static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier)

Создаёт локальную переменную потока. Начальное значение переменной определяется путём вызова метода get на Supplier.

Параметры типа:
S - тип значения локальной переменной потока
Параметры:
supplier - поставщик, используемый для определения начального значения
Возвращает:
новую локальную переменную потока
Исключения:
NullPointerException - если указанный поставщик равен null
С:
1.8

get

public T get()

Возвращает значение в копии переменной, локальной для текущего потока. Если для текущего потока переменная не имеет значения, она сначала инициализируется значением, возвращаемым методом initialValue().

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

set

public void set(T value)

Устанавливает копию переменной, локальной для текущего потока, в указанное значение. Большинству подклассов не требуется переопределять этот метод, полагаясь только на метод initialValue() для установки значений локальных переменных потоков.

Параметры:
value - значение, которое будет храниться в копии переменной, локальной для текущего потока.

remove

public void remove()

Удаляет значение текущего потока для этой локальной переменной. Если эта локальная переменная потока впоследствии читается текущим потоком, её значение будет повторно инициализировано путём вызова метода initialValue(), если её значение не будет установлено текущим потоком во временном промежутке. Это может привести к многократным вызовам метода initialValue в текущем потоке.

С:
1.5

© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API