• Threadlocal


    ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

    Java.lang.Threadlocal可以存储当前thread的变量,而servlet的一次请求正好满足这个情况(包括后面业务代码),所以需要把类放入Threadlocal的实例中。

    Threadloacl中有4种接口方法:

    void set(object value)

    设置当前线程的线程局部变量的值

    public object get()

    该方法返回当前线程所对应线程的局部变量

    public void remove()

    将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。

    protected object initialValue()

    返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。

    1。 初始化一个ThreadLocal对象,ThreadLocal有三个成员方法 get()、set()、initialvalue()。 
        如果不初始化initialvalue,则initialvalue返回null。 
    3。session的get根据当前线程返回其对应的线程内部变量,也就是我们需要的net.sf.hibernate.Session(相当于对应每个数据库连接).多线程情况下共享数据库链接是不安全的。ThreadLocal保证了每个线程都有自己的s(数据库连接)。 
    5。如果是该线程初次访问,自然,s(数据库连接)会是null,接着创建一个Session,具体就是行6。 
    6。创建一个数据库连接实例 s 
    7。保存该数据库连接s到ThreadLocal中。 
    8。如果当前线程已经访问过数据库了,则从session中get()就可以获取该线程上次获取过的连接实例。

    它主要由四个方法组成initialValue(),get(),set(T),remove(),其中值得注意的是initialValue(),该方法是一个protected的方法,显然是为了子类重写而特意实现的。该方法返回当前线程在该线程局部变量的初始值,这个方法是一个延迟调用方法,在一个线程第1次调用get()或者set(object)时才执行,并且仅执行1次。threadLocal中的确实实现直接返回一个null:

    ThreadLoacl的原理

    ThreadLoacl是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在Threadlocal类中有一个Map,用于存储每一个线程的变量的副本。

    public class ThreadLocal
    {
     private Map values = Collections.synchronizedMap(new HashMap());
     public Object get()
     {
      Thread curThread = Thread.currentThread(); 
      Object o = values.get(curThread); 
      if (o == null && !values.containsKey(curThread))
      {
       o = initialValue();
       values.put(curThread, o); 
      }
      return o; 
     }

     public void set(Object newValue)
     {
      values.put(Thread.currentThread(), newValue);
     }

     public Object initialValue()
     {
      return null; 
     }
    }

  • 相关阅读:
    父容器的flowover:hidden 必须配合父容器的宽高height width才能生效
    css使 同一行内的 文字和图片 垂直居中对齐?
    vim查找替换
    要让div中的float不会自动显示到下一行来?
    如何理解clear的css属性?
    div+css使多行文字垂直居中?
    VMnet1和V8
    unslider的用法详解
    json的中括号和大括号的使用?
    如何合理定价,定价定天下,必须要学会这个哦!
  • 原文地址:https://www.cnblogs.com/liang67732116/p/5837724.html
Copyright © 2020-2023  润新知