Класс 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(), если не будет установлено другое значение с помощью set текущим потоком. Это может привести к нескольким вызовам метода 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.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ThreadLocal.html