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