ThreadLocal的作用与实现思想
2008-06-11 00:25
253 查看
ThreadLocal类的作用是为每个线程都创建一个变量副本, 每个线程都可以修改自己所拥有的变量副本, 而不会影响其他线程的副本. 其实这也是解决线程安全的问题的一种方法.
/**以下内容收藏自网络**/
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类在实现思路上是相近的。
/*将为每个线程都长生一个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类在实现思路上是相近的。
相关文章推荐
- Java中ThreadLocal类的作用以及实现原理-----hibernate的连接池就是用ThreadLocal实现的
- ThreadLocal作用与实现
- 二进制转十六进制 算法实现思想
- MockServer的测试思想与实现
- 开源:VS.NET打印思想与2003/5DataGrid、DataGridView及二维数据如ListView等终极打印实现
- 关于C语言通用双向链表实现的测试--回调函数的作用
- 成为富有实现思想的系统开发者的几点建议
- Java中实现Serializable接口的类中serialVersionUID常量的作用
- 采用结构化程序设计思想实现模拟ATM(自动柜员机)
- java多线程学习之通过ThreadLocal实现每个线程拥有自己的变量
- Esper入门简介:四、 由上篇三我们实现个简单的报警作用吧
- java并发(3)ThreadLocal的使用及实现原理(实现原理)
- 简述多线程的作用以及什么地方会用到多线程? OC实现多线程的方法有哪些?
- ThreadLocal的实现方式
- 通用权限实现的核心设计思想
- 虚函数的作用和实现原理
- 【线程高新】——【ThreadLocal实现线程范围的共享变量】
- addEventListener(type, fn , true/false)绑定事件第三个参数作用以及利用事件的冒泡,实现事件委托
- FactoryBean的实现原理与作用
- ThreadLocal用法和实现原理