Java ThreadLocal

ThreadLocal说明:

ThreadLocal是一个本地线程。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。所以是线程局部变量。
ThreadLocal为每一个线程维护变量的副本,在ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本。

ThreadLocal的接口方法:

public void set(Object value)
设置当前线程的线程局部变量的值。

public Object get()
该方法返回当前线程所对应的线程局部变量。

public void remove()
将当前线程局部变量的值删除,目的是为了减少内存的占用。当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。
public class ThreadLocal
{
  private Map values = Collections.synchronizedMap(new HashMap());
  public Object get()
  {
   Thread curThread = Thread.currentThread(); 
   Object o = values.get(curThread); 
   if (o == null && !values.containsKey(curThread))
   {
    o = initialValue();
    values.put(curThread, o); 
   }
   return o; 
  }

  public void set(Object newValue)
  {
   values.put(Thread.currentThread(), newValue);
  }

  public Object initialValue()
  {
   return null; 
  }
}
以hibernate中典型的ThreadLocal的应用:
private static final ThreadLocal threadSession = new ThreadLocal();     
     
public static Session getSession() throws InfrastructureException {     
     Session s = (Session) threadSession.get();     
    try {     
        if (s == null) {   
  
          //每一个线程第一次使用getSession都会到这,调用openSession。  
  
             s = getSessionFactory().openSession();     
             threadSession.set(s);     
         }     
     } catch (HibernateException ex) {     
        throw new InfrastructureException(ex);     
     }     
    return s;     
} 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值