ThreadLocal 你究竟是个什么鬼

 

    不少文章都拿它跟同步机制做比较,我以为这个思路对于理解这个东西彻底没有做用。java

ThreadLocal跟synchronize这类东西做比较,是不少文章的套路,我感受这么比较,就跟比较重载跟重写的区别,final跟finally的区别同样,越比较越混乱。二者关注的方向压根都不一样。session

   ThreadLocal的应用场合,我以为最适合的是按线程多实例(每一个线程对应一个实例)的对象的访问,而且这个对象不少地方都要用到dom

    这个是我以为解释ThreadLocal最好的总结,ide

    session的例子特别能够说明问题,一个线程对应一个session,在执行的过程中可能不少地方都要获取session中的值,若是在编写代码的过程中,一直把session当作一个传参数,在方法中或者对象间各类传递,也不是不能够,可是这代码得是有多难看。可是使用TreadLocal的话,代码就简便了不少。并且还有很好的隔离性。因此ThreadLocal是一种编写代码的思路,可是并非只能采用这种方式才行。最后抄个例子,简单的说明下这个东东怎么用。this

package test;  
  
import java.util.Random;  
  
class Student {  
    private int age;  
  
    public int getAge() {  
        return age;  
    }  
  
    public void setAge(int age) {  
        this.age = age;  
    }  
}  
  
public class TestThreadLocal implements Runnable {  
  
    ThreadLocal studentLocal = new ThreadLocal();  
  
    public static void main(String[] args) {  
        TestThreadLocal t = new TestThreadLocal();  
        new Thread(t, "t1").start();  
        new Thread(t, "t2").start();  
    }  
  
    @Override  
    public void run() {  
        accessStudent();  
    }  
  
    private void accessStudent() {  
        Student s = this.getStudent();  
        Random random = new Random();  
        int age = random.nextInt(100);  
        System.out.println("current thread set age " + Thread.currentThread()  
                + ":" + age);  
        s.setAge(age);  
        System.out.println("current thread first get age "  
                + Thread.currentThread() + ":" + s.getAge());  
        try {  
            Thread.sleep(500);  
        } catch (InterruptedException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        System.out.println("current thread second get age "  
                + Thread.currentThread() + ":" + s.getAge());  
    }  
  
    public Student getStudent() {  
        Student s = (Student) studentLocal.get();  
        if (s == null) {  
            s = new Student();  
            studentLocal.set(s);  
        }  
        return s;  
    }  
}