2019独角兽企业重金招聘Python工程师标准>>>
很多文章都拿它跟同步机制作比较,我觉得这个思路对于理解这个东西完全没有作用。
ThreadLocal跟synchronize这类东西作比较,是很多文章的套路,我感觉这么比较,就跟比较重载跟重写的区别,final跟finally的区别一样,越比较越混乱。两者关注的方向压根都不同。
ThreadLocal的应用场合,我觉得最适合的是按线程多实例(每个线程对应一个实例)的对象的访问,并且这个对象很多地方都要用到
这个是我觉得解释ThreadLocal最好的总结,
session的例子特别可以说明问题,一个线程对应一个session,在执行的过程当中可能很多地方都要获取session中的值,如果在编写代码的过程当中,一直把session当做一个传参数,在方法中或者对象间各种传递,也不是不可以,但是这代码得是有多难看。但是使用TreadLocal的话,代码就简便了很多。而且还有很好的隔离性。所以ThreadLocal是一种编写代码的思路,但是并不是只能采用这种方式才行。最后抄个例子,简单的说明下这个东东怎么用。
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; }
}