ThreadLocal

本文介绍了ThreadLocal的基本概念及其如何解决多线程环境中变量访问冲突的问题。通过一个SequenceNumber类的具体实现,展示了ThreadLocal如何为每个线程提供独立的变量副本。

http://blog.youkuaiyun.com/qjyong/archive/2008/03/08/2158097.aspx

1.其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。

 

2.ThreadLocal和线程同步机制相比有什么优势呢?ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的.ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。

 

public class SequenceNumber {

  //①通过匿名内部类覆盖ThreadLocal的initialValue()方法,指定初始值
  
  private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>(){
   
   public Integer initialValue(){
   
    return 0;
   
   }
  
  };
  
  //②获取下一个序列值
  
  public int getNextNum(){
  
   seqNum.set(seqNum.get()+1);
  
   return seqNum.get();
  
  }
  
  public static void main(String[] args)
  
  {
  
   SequenceNumber sn = new SequenceNumber();
  
  //③ 3个线程共享sn,各自产生序列号
  
   TestClient t1 = new TestClient(sn);
   
   TestClient t2 = new TestClient(sn);
  
   TestClient t3 = new TestClient(sn);
  
   t1.start();
  
   t2.start();
  
   t3.start();
   
  }
      /* thread[Thread-1] sn[1]虽然共用了同一个SequenceNumber,
                      thread[Thread-2] sn[1]     但是各线程之间互不干涉.
                      thread[Thread-0] sn[1]
                      thread[Thread-1] sn[2]
                      thread[Thread-2] sn[2]
                      thread[Thread-0] sn[2]
                      thread[Thread-1] sn[3]
                      thread[Thread-2] sn[3]
                      thread[Thread-0] sn[3]*/
  
 private static class TestClient extends Thread
  
  {
  
   private  SequenceNumber sn;
   
   public TestClient(SequenceNumber sn) {
   
   this.sn = sn;
   
  }
  
  public void run()
  
  {
   
   for (int i = 0; i < 3; i++) {//④每个线程打出3个序列值
   
   System.out.println("thread["+Thread.currentThread().getName()+
   
   "] sn["+sn.getNextNum()+"]");
   
   }
  
  }
  
  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值