Класс 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 |
Устанавливает для копии этой локальной переменной потока текущего потока указанное значение. |
static <S> ThreadLocal |
withInitial |
Создаёт локальную переменную потока. |
Подробное описание конструкторов
ThreadLocal
public ThreadLocal()
- См. также:
Подробное описание методов
initialValue
protected T initialValue()
get(), если только поток ранее не вызывал метод set(T); в этом случае метод initialValue для данного потока вызван не будет. Обычно этот метод вызывается не более одного раза для каждого потока, но может быть вызван повторно при последующих вызовах remove(), за которыми следует вызов get().- Требования к реализации:
- Эта реализация просто возвращает
null; если программисту требуется, чтобы локальные переменные потока имели начальное значение, отличное отnull, можно либо создать подклассThreadLocalи переопределить этот метод, либо использовать методwithInitial(Supplier)для создания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, 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