java.lang.ThreadLocal例子

public class ThreadLocal<T>  extends Object 

该类提供了线程局部变量.这些变量不同于它们的普通对应物.因为访问一个变量(通过其 getset 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本.ThreadLocal 实例通常是类中的私有静态字段它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。

 


    
    
public  ThreadLocalTest()  {} ;
    
    
//  通过匿名内部类覆盖ThreadLocal的initialValue()方法,指定初始值
     private   static  ThreadLocal < Integer >  seqNum  =   new  ThreadLocal < Integer > ()  {     
        
protected Integer initialValue() {
            
return 0;
        }

    }
;
    
    
//  获取下一个序列值
     public   int  getNextNum()  {
        
        seqNum.set(seqNum.get()
+1);
        
return seqNum.get();
    }

    
    
public   static   void  main(String[] args)  {
        
        ThreadLocalTest test 
= new ThreadLocalTest();
        
        
// 3个线程共享sn,各自产生序列号
        TestClient client1 = new TestClient(test);
        TestClient client2 
= new TestClient(test);
        TestClient client3 
= new TestClient(test);
        
        client1.start();
        client2.start();
        cl
public   class  TestClient  extends  Thread  {
    
    
private ThreadLocalTest test;
    
    
/**
     * 构造函数.
     
*/

    
public TestClient() {};
    
    
/**
     * 构造函数.
     
*/

    
public TestClient(ThreadLocalTest test) {
        
        
this.test = test;
    }
;
    
    @Override
    
public void run() {
        
        
//{④每个线程打出3个序列值
        for(int i=0 ; i<=3 ; i++{
            
            System.err.println(
"[currentThread name:>>]" +Thread.currentThread().getName() + "===NextNum is:==" +test.getNextNum());
        }

    }

}
ient3.start();
    }

结果

========================

[currentThread name:>>]Thread-0===NextNum is:==1
[currentThread name:>>]Thread-0===NextNum is:==2
[currentThread name:>>]Thread-0===NextNum is:==3
[currentThread name:>>]Thread-0===NextNum is:==4
[currentThread name:>>]Thread-1===NextNum is:==1
[currentThread name:>>]Thread-1===NextNum is:==2
[currentThread name:>>]Thread-1===NextNum is:==3
[currentThread name:>>]Thread-1===NextNum is:==4
[currentThread name:>>]Thread-2===NextNum is:==1
[currentThread name:>>]Thread-2===NextNum is:==2
[currentThread name:>>]Thread-2===NextNum is:==3
[currentThread name:>>]Thread-2===NextNum is:==4

========================

 通常我们通过匿名内部类的方式定义ThreadLocal的子类.

考察输出的结果信息,我们发现每个线程所产生的序号虽然都共享同一个ThreadLocalTest实例但它们并没有发生相互干扰的情况,而是各自产生独立的序列号,这是因为我们通过ThreadLocal为每一个线程提供了单独的副本。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值