ThreadLocal的作用是提供线程内的局部变量,这种单例属于线程内部安全。
package com.going.design.singleton.threadlocal;
/**
* Created by renxf on 2021/1/3
*/
public class ThreadLocalSingleton {
private ThreadLocalSingleton(){};
private static final ThreadLocal<ThreadLocalSingleton> threadLocalInstance =
new ThreadLocal<ThreadLocalSingleton>(){
@Override
protected ThreadLocalSingleton initialValue() {
return new ThreadLocalSingleton();
}
};
public static ThreadLocalSingleton getInstance(){
return threadLocalInstance.get();
}
}
测试类
package com.going.design.singleton.threadlocal;
import com.going.design.singleton.lazy.LazyDoubleCheckSingleton;
/**
* Created by renxf on 2021/1/3
*/
public class TestThreadLocalSingleton {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()+":"+ThreadLocalSingleton.getInstance());
System.out.println(Thread.currentThread().getName()+":"+ThreadLocalSingleton.getInstance());
System.out.println(Thread.currentThread().getName()+":"+ThreadLocalSingleton.getInstance());
Thread t1 = new Thread(new ExectorThread3());
Thread t2 = new Thread(new ExectorThread3());
t1.start();
t2.start();
System.out.println("End");
}
}
class ExectorThread3 implements Runnable{
@Override
public void run() {
// ThreadLocalSingleton lazy = ThreadLocalSingleton.getInstance();
System.out.println(Thread.currentThread().getName()+":"+ThreadLocalSingleton.getInstance());
System.out.println(Thread.currentThread().getName()+":"+ThreadLocalSingleton.getInstance());
System.out.println(Thread.currentThread().getName()+":"+ThreadLocalSingleton.getInstance());
System.out.println(Thread.currentThread().getName()+":"+ThreadLocalSingleton.getInstance());
}
}
结果如下:可以很直观的看出同一线程内部的对象为统一对象。