ThreadLocal实现线程单例

断了今生、忘了曾经 提交于 2020-01-31 21:18:39

提示:其实是伪线程安全的。
使用场景:ORM框架中实现多数据源动态切换。

public class ThreadLocalSingleton {
    private static final ThreadLocal<ThreadLocalSingleton> threadLocalInstance =
            new ThreadLocal<ThreadLocalSingleton>(){
                @Override
                protected ThreadLocalSingleton initialValue() {
                    return new ThreadLocalSingleton();
                }
            };

    private ThreadLocalSingleton(){}

    public static ThreadLocalSingleton getInstance(){
        return threadLocalInstance.get();
    }
}
public static void main(String[] args) { 
    System.out.println(ThreadLocalSingleton.getInstance()); 
    System.out.println(ThreadLocalSingleton.getInstance()); 
    System.out.println(ThreadLocalSingleton.getInstance()); 
    System.out.println(ThreadLocalSingleton.getInstance()); 
    System.out.println(ThreadLocalSingleton.getInstance());
    Thread t1 = new Thread(new ExectorThread()); 
    Thread t2 = new Thread(new ExectorThread()); 
    t1.start(); 
    t2.start();
    System.out.println("End"); 
}

结果:
在这里插入图片描述
mian线程,Thread-1线程,Thread-0线程,各自线程中是唯一的,但是各个线程之间是互不一样的。
通过查看ThreadLocal的源码
在这里插入图片描述
ThreadLocalMap的set方法key其实就是当前的线程本身,value就是我们放到map中的value的值,所以就保证了上面出现的结果。即线程内是安全的。

这里其实是注册式单利中的容器类

Java糖果罐
扫码关注
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!