java并发编程实践 ThreadLocal

3 篇文章 0 订阅
2 篇文章 0 订阅

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


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值