threadLocal原理以及使用

threadLocal原理以及使用:

1.threadloca解决了什么问题? 问题的抛出

     例子:比如实例化一个数据库连接的方法类,里面有connect变量

     问题点:此方法需考虑线程同步,不然的话会有多线程同时创建问题,但是会大大影响程序执行效率, 因为一个线程在使用connect进行数据库操作的时候,其他线程只有等待。

    解决方法:就是不使用static的方法变量,这样也没问题, 方法中需要频繁地开启和关闭数据库连接,影响程序执行效率,导致服务器压力巨大。

 

2.threadlocal内部实现

     每个线程Thread内部有一个ThreadLocal.ThreadLocalMap类型的成员变量threadLocals

threadLocals就是用来存储实际的变量副本的,键值为当前ThreadLocal变量,value为变量副本(即T类型的变量)。

    初始时,在Thread里面,threadLocals为空,当通过ThreadLocal变量调用get()方法或者set()方法,就会对Thread类中的threadLocals进行初始化,并且以当前ThreadLocal变量为键值,以ThreadLocal要保存的副本变量为value,存到threadLocals。

  然后在当前线程里面,如果要使用副本变量,就可以通过get方法在threadLocals里面查找。

3.threadlocal使用例子

ThreadLocal使用场景为 用来解决 数据库连接、Session管理等

 

第一段:

private static ThreadLocal connectionHolder= new ThreadLocal() {

public Connection initialValue() {

    return DriverManager.getConnection(DB_URL);

}

};

 

public static Connection getConnection() {

return connectionHolder.get();

}

 

第二段:

private static final ThreadLocal threadSession = new ThreadLocal();

 

public static Session getSession() throws InfrastructureException {

    Session s = (Session) threadSession.get();

    try {

        if (s == null) {

            s = getSessionFactory().openSession();

            threadSession.set(s);

        }

    } catch (HibernateException ex) {

        throw new InfrastructureException(ex);

    }

    return s;

你可能感兴趣的:(java总结)