ThreadLocal的作用与实现思想

ThreadLocal类的作用是为每个线程都创建一个变量副本, 每个线程都可以修改自己所拥有的变量副本, 而不会影响其他线程的副本. 其实这也是解决线程安全的问题的一种方法.
/*将为每个线程都长生一个Session对象    */    
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";   
private static final ThreadLocal threadLocal = new ThreadLocal();   
private static org.hibernate.SessionFactory sessionFactory;    
private static String configFile = CONFIG_FILE_LOCATION;     
static {     
   try { 		
	configuration.configure(configFile); 		
	sessionFactory = configuration.buildSessionFactory(); 	
	} catch (Exception e) { 
		System.err .println("%%%% Error Creating SessionFactory %%%%"); 
		e.printStackTrace(); 	
	}    
 }    
 public static Session getSession() throws HibernateException {    
     Session session = (Session) threadLocal.get();  //获取变量  	
     if (session == null || !session.isOpen()) { 	
     if (sessionFactory == null) { 				
        rebuildSessionFactory(); 		
     } 			
     session = (sessionFactory != null) ? sessionFactory.openSession(): null; 		
     threadLocal.set(session);  //设置变量 	
  }         
   return session;    
}

/**以下内容收藏自网络**/ ThreadLocal是如何做到为每一个线程维护变量的副本的呢? 其实实现的思路很简单:在ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本。 我们自己就可以提供一个简单的实现版本: 代码清单1 SimpleThreadLocal public class SimpleThreadLocal { private Map valueMap = Collections.synchronizedMap(new HashMap()); public void set(Object newValue) { valueMap.put(Thread.currentThread(), newValue);①键为线程对象,值为本线程的变量副本 } public Object get() { Thread currentThread = Thread.currentThread(); Object o = valueMap.get(currentThread);②返回本线程对应的变量 if (o == null && !valueMap.containsKey(currentThread)) {

③如果在Map中不存在,放到Map中保存起来。 o = initialValue(); valueMap.put(currentThread, o); } return o; } public void remove() { valueMap.remove(Thread.currentThread()); } public Object initialValue() { return null; } } 虽然这个ThreadLocal实现版本显得比较幼稚,但它和JDK所提供的ThreadLocal类在实现思路上是相近的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值