开发者社区> 问答> 正文

Java如何为每个线程提供一个单例?

普通单例模式我明白,但是现在希望实现每个线程都有一个唯一的单例,应该怎么做?
我知道用Threadlocal变量可以为每个线程提供一个独立的实例,但是不能保证这个实例是唯一的、不可变得。
如果用volatile修饰的话,按volatile的意义理解就是每个线程都有一份实例的副本,但是这些副本是不是同一个对象呢?

展开
收起
蛮大人123 2016-03-03 16:47:50 2197 0
2 条回答
写回答
取消 提交回答
  • 什么样的场景会要求每个线程都要单例?

    2019-07-17 18:51:40
    赞同 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪
    class ThreadLocalSingleton {
    
        private ThreadLocalSingleton(){}
    
        public final static ThreadLocal<ThreadLocalSingleton> INSTANCE = 
                new ThreadLocal<ThreadLocalSingleton>(){
            @Override 
            protected ThreadLocalSingleton initialValue(){
                return new ThreadLocalSingleton();
            }
        };
    
    }
    
    public class ThreadLocalSingletonTest{
    
        @Test
        public void testThreadLocalSingleton() throws InterruptedException{
            for(int i=0; i<5; i++){
                new Thread(new Runnable(){
                    @Override
                    public void run() {
                        System.out.println(ThreadLocalSingleton.INSTANCE.get());
                    }
                }).start();
            }
            Thread.sleep(3000);
        }
    
    }

    结果, 每个thread都对应唯一的不可变的 ThreadLocalSingleton实例:
    `
    com.test.loader.ThreadLocalSingleton@7d7c214d
    com.test.loader.ThreadLocalSingleton@606e8697
    com.test.loader.ThreadLocalSingleton@784654f6
    com.test.loader.ThreadLocalSingleton@5174202a
    com.test.loader.ThreadLocalSingleton@1eebcf2d`

    2019-07-17 18:51:40
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
多IO线程优化版 立即下载