ThreadLocal是什么

来源:互联网 发布:json劫持漏洞 编辑:程序博客网 时间:2024/04/29 23:55

在本机单个jvm下,理解一下单例模式和 ThreadLocal,希望对初学者有所帮助。

1。研究单例

单例的简单源码

<------------------------------------------------------------------------------------------->

public class CarFactory {
 //线程级共享的
 private static final ThreadLocal cars=new ThreadLocal();
 //持有的本身的实例
 private static final CarFactory single=new CarFactory();
 //私有的构造器
 private CarFactory(){
  
 }
 //返回本身持有的实例
 public static CarFactory getInstance(){
  return CarFactory.single;
 }
 //返回一个car的实例
 public  Car makeCar(){
  //获得一个汽车
  Car car=(Car)cars.get();
  if(car==null){
   car=new Car();
   cars.set(car);
  }
  return car;
 }
}
<---------------------------------------------------------------------------------------------->

Test类源码 ,实现了Runnable接口

<------------------------------------------------------------------------------------------->

public class Test implements Runnable {

 public static void main(String[] args) {
  Test test=new Test();
  //本线程执行
  test.run();
  //新开一个线程执行
  new Thread(test).start();
 }

 public void run() {
  //获得single的实例
  CarFactory factory=CarFactory.getInstance();
  //打印出该实例
  System.out.println(Thread.currentThread().hashCode()+":"+factory);
  //获得当前汽车
  Car car=factory.makeCar();
  System.out.println(Thread.currentThread().hashCode()+":"+car);
  //再造一辆
  car=factory.makeCar();
  System.out.println(Thread.currentThread().hashCode()+":"+car);
 }

}

<---------------------------------------------------------------------------------------------->

运行结果:

线程1                                                   线程2
26399554:CarFactory@6b97fd     16164678:CarFactory@6b97fd
26399554:Car@5224ee                 16164678:Car@15ff48b     
26399554:Car@5224ee                 16164678:Car@15ff48b     

结论:两个线程获得的为同一个实例,造了2辆车,每个线程只有一辆。

2。ThreadLocal研究

ThreadLocal是什么
ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。

从上例看出,static的 TheadLocal 针对每个不同的线程保存了一份数值,而线程之间变量值毫无关系。

原创粉丝点击