public class ThreadLocal<T> extends Object
该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。
方法摘要 T
get ()
返回此线程局部变量的当前线程副本中的值。protected T
initialValue ()
返回此线程局部变量的当前线程的“初始值”。 void
remove ()
移除此线程局部变量当前线程的值。 void
set (T value)
将此线程局部变量的当前线程副本中的值设置为指定值。
实验代码如下: abstract class Base
{
abstract public int get();
abstract public void set(int value);
}
class AA extends Base
{
ThreadLocal<Integer> i=new ThreadLocal<Integer>()
{
public Integer initialValue()
{
return 0;
}
};
public int get()
{
return i.get();
}
public void set(int value)
{
this.i.set(value);
}
}
class BB extends Base
{
int i;
public int get()
{
return this.i;
}
public void set(int value)
{
this.i=value;
}
}
class Test implements Runnable
{
Base b;
public Test(Base b)
{
this.b=b;
}
@Override
public void run()
{
for(int i=0;i<3;i++)
{
this.b.set(this.b.get()+10);
System.out.println( Thread.currentThread().toString()+this.b.get());
}
}
}
public class ThreadLocalTest {
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
System.out.println("===============使用ThreadLocal结果如下:==================");
AA aa=new AA();
Thread t11=new Thread(new Test(aa));
Thread t12=new Thread(new Test(aa));
Thread t13=new Thread(new Test(aa));
t11.start();
t12.start();
t13.start();
Thread.sleep(1000);
System.out.println("===============不使用ThreadLocal结果如下:==================");
BB bb=new BB();
Thread t21=new Thread(new Test(bb));
Thread t22=new Thread(new Test(bb));
Thread t23=new Thread(new Test(bb));
t21.start();
t22.start();
t23.start();
}
}
运行结果: