在本机单个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 针对每个不同的线程保存了一份数值,而线程之间变量值毫无关系。