您的位置:首页 > 编程语言 > Java开发

java并发编程实践 ThreadLocal

2012-07-27 11:32 603 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: