关于ThreadLocal

什么是ThreadLocal

ThreadLocal是让各个线程拥有独立的对象,互不干扰。
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路

ThreadLocal的接口方法
  • void set(Object value) 设置当前线程局部变量的值
  • public Object get() 获取当前线程局部变量的值
  • public void remove()将当前线程局部变量的值删除
  • protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个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) {
                s = getSessionFactory().openSession();
                threadSession.set(s);
            }
        } catch (HibernateException ex) {
            throw new InfrastructureException(ex);
        }
        return s;
    }

ThreadLocal保证了每个线程都有自己的s,如果是该线程初次访问,自然,通过get()方法得到的s(数据库连接)会是null,接着创建一个数据库连接,然后通过set()方法保存。如果当前线程已经访问过数据库了,则从session中get()就可以获取该线程上次获取过的连接实例。这样就保证了各个线程之间不会发生共享数据库链接的情况。

你可能感兴趣的:(java)