普通单例模式我明白,但是现在希望实现每个线程都有一个唯一的单例,应该怎么做?
我知道用Threadlocal变量可以为每个线程提供一个独立的实例,但是不能保证这个实例是唯一的、不可变得。
如果用volatile修饰的话,按volatile的意义理解就是每个线程都有一份实例的副本,但是这些副本是不是同一个对象呢?
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`
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。