ThreadLocal 的功能,能够为各个访问的线程copy出初始化后的资源副本,因此各个访问资源的线程在改变资源状态的时候,只是改变分配给该线程副本的状态,因此各个线程之间没有干扰,可以按照各自设定的序列执行。
对比代码如下:
UniqueInt与iTest分别为两个Integer类型的数据。UniqueInt应用了ThreadLocal。
线程T1与T2分别进行-1与+2操作。
如果没有应用ThreadLocal的iTest会因为两个线层都在访问,打印出可不预测的结果,而uniqueInt则在各自的线程中按照-1与+2的操作打印。
package ThreadLocal;
public class TestThreadLocal {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new TestThreadLocal().test1();
}
public void test1()
{
T1 t11 = new T1();
// T1 t12 = new T1();
T2 t21 = new T2();
// T2 t22 = new T2();
t11.start();
// t12.start();
t21.start();
// t22.start();
}
//ThreadLocal
private final ThreadLocal<Integer> uniqueInt =
new ThreadLocal<Integer>()
{
@Override protected Integer initialValue()
{
return new Integer(0);
}
};
//对比数据
private Integer itest = new Integer(0);
/**
* 对全局变量进行-1操作。
* @author
*
*/
class T1 extends Thread
{
public void run() {
// TODO Auto-generated method stub
for(int i=0 ; i < 10; i++)
{
uniqueInt.set(uniqueInt.get()-1);
itest = itest-1;
System.out.println(Thread.currentThread().getName()+"T1 uInt :" + uniqueInt.get());
System.out.println(Thread.currentThread().getName()+"T1 itest:" + itest);
}
}
}
/**
* 对全局变量进行+2操作。
* @author
*
*/
class T2 extends Thread
{
public void run() {
// TODO Auto-generated method stub
for(int i=0 ; i < 10; i++)
{
uniqueInt.set((uniqueInt.get().intValue())+2);
itest=itest+2;
System.out.println(Thread.currentThread().getName()+"T2 uInt:" + uniqueInt.get());
System.out.println(Thread.currentThread().getName()+"T2 itest:" + itest);
}
}
}
}
打印结果如下:
Thread-1T2 uInt:2
Thread-0T1 uInt :-1
Thread-1T2 itest:1
Thread-0T1 itest:1
Thread-1T2 uInt:4
Thread-0T1 uInt :-2
Thread-1T2 itest:2
Thread-0T1 itest:2
Thread-1T2 uInt:6
Thread-0T1 uInt :-3
Thread-1T2 itest:3
Thread-0T1 itest:3
Thread-1T2 uInt:8
Thread-0T1 uInt :-4
Thread-1T2 itest:4
Thread-0T1 itest:4
Thread-1T2 uInt:10
Thread-0T1 uInt :-5
Thread-1T2 itest:5
Thread-0T1 itest:5
Thread-1T2 uInt:12
Thread-0T1 uInt :-6
Thread-1T2 itest:6
Thread-0T1 itest:6
Thread-1T2 uInt:14
Thread-0T1 uInt :-7
Thread-1T2 itest:7
Thread-0T1 itest:7
Thread-1T2 uInt:16
Thread-0T1 uInt :-8
Thread-1T2 itest:8
Thread-0T1 itest:8
Thread-1T2 uInt:18
Thread-0T1 uInt :-9
Thread-1T2 itest:9
Thread-0T1 itest:9
Thread-1T2 uInt:20
Thread-0T1 uInt :-10
Thread-1T2 itest:10
Thread-0T1 itest:10