public class ThreadLocal
extends Object
| java.lang.Object | |
| ↳ | java.lang.ThreadLocal<T> |
| |
这个类提供线程局部变量。 这些变量与它们的正常副本不同,因为访问一个线程的每个线程(通过它的方法get或set )都有其自己的独立初始化变量副本。 ThreadLocal实例通常是希望将状态与线程关联的类(例如,用户ID或事务ID)中的私有静态字段。
例如,下面的类为每个线程生成本地唯一的标识符。 线程的ID在第一次调用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实例,每个线程就会保持对其线程局部变量副本的隐式引用; 在线程消失后,线程本地实例的所有副本都将进行垃圾回收(除非存在对这些副本的其他引用)。
Public constructors |
|
|---|---|
ThreadLocal() 创建一个线程局部变量。 |
|
Public methods |
|
|---|---|
T |
get() 返回此线程局部变量的当前线程副本中的值。 |
void |
remove() 删除此线程局部变量的当前线程值。 |
void |
set(T value) 将此线程局部变量的当前线程的副本设置为指定的值。 |
Protected methods |
|
|---|---|
T |
initialValue() 返回此线程局部变量的当前线程的“初始值”。 |
Inherited methods |
|
|---|---|
java.lang.Object
|
|
T get ()
返回此线程局部变量的当前线程副本中的值。 如果该变量对当前线程没有值,则首先将其初始化为调用initialValue()方法返回的值。
| Returns | |
|---|---|
T |
the current thread's value of this thread-local |
void remove ()
删除此线程局部变量的当前线程值。 如果此线程局部变量随后是当前线程read ,则通过调用其initialValue()方法将其值重新初始化,除非其值为当前线程在过渡时期的set 。 这可能会导致在当前线程中多次调用initialValue方法。
void set (T value)
将此线程局部变量的当前线程的副本设置为指定的值。 大多数子类都不需要重写此方法,仅依靠initialValue()方法来设置线程本地值。
| Parameters | |
|---|---|
value |
T: the value to be stored in the current thread's copy of this thread-local. |
T initialValue ()
返回此线程局部变量的当前线程的“初始值”。 该方法将被调用的第一次一个线程访问与可变get()方法,除非线程先前调用的set(T)方法,在这种情况下initialValue方法将不被调用的线程。 通常,每个线程最多调用一次此方法,但在后续调用remove()后跟随get() ,可能会再次调用此方法。
该实现仅返回null ; 如果程序员希望线程局部变量具有除null以外的初始值, 则必须将ThreadLocal分类,并重写此方法。 通常,将使用匿名内部类。
| Returns | |
|---|---|
T |
the initial value for this thread-local |