Spec-Zone.ru › OpenJDK 25

Класс ThreadLocal<T>

java.lang.Object
java.lang.ThreadLocal<T>
Параметры типа:
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)
Создаёт локальную переменную потока.

Методы, объявленные в классе 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(Supplier) для создания ThreadLocal.
Возвращает:
начальное значение этой локальной переменной потока
См. также:
  • withInitial(java.util.function.Supplier)

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

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторские права © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, 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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/ThreadLocal.html

Spec-Zone.ru

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