ThreadLocal是什麼

在本機單個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 針對每個不同的線程保存了一份數值,而線程之間變量值毫無關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章