| 1.它是local variable(线程局部变量)。就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。 2.ThreadLocal类:它主要由四个方法组成initialValue(),get(),set(T),remove().
 3.ThreadLocal 的使用
 使用方法一:Hibernate的文档时看到了关于使ThreadLocal管理多线程访问的部分。具体代码如下 :
 public static final ThreadLocal session = new ThreadLocal();
 public static Session currentSession() {
 Session s = (Session)session.get();
 //open a new session,if this session has none
 if(s == null){
 s = sessionFactory.openSession();
 session.set(s);
 }
 return s;
 }
 
 使用方法二
 当要给线程初始化一个特殊值时,需要自己实现ThreadLocal的子类并重写该方法,通常使用一个内部匿名类对ThreadLocal进行子类化,EasyDBO中创建jdbc连接上下文就是这样做的:
 
 public class JDBCContext{
 private static Logger logger = Logger.getLogger(JDBCContext.class);
 private DataSource ds;
 protected Connection connection;
 private boolean isValid = true;
 private static ThreadLocal jdbcContext;
 
 private JDBCContext(DataSource ds){
 this.ds = ds;
 createConnection();
 }
 public static JDBCContext getJdbcContext(javax.sql.DataSource ds)
 {
 if(jdbcContext==null)jdbcContext=new JDBCContextThreadLocal(ds);
 JDBCContext context = (JDBCContext) jdbcContext.get();
 if (context == null) {
 context = new JDBCContext(ds);
 }
 return context;
 }
 
 private static class JDBCContextThreadLocal extends ThreadLocal {
 public javax.sql.DataSource ds;
 public JDBCContextThreadLocal(javax.sql.DataSource ds)
 {
 this.ds=ds;
 }
 protected synchronized Object initialValue() {
 return new JDBCContext(ds);
 }
 }
 }
 
 
 
 
 
 
 |