Ren*_*ani 14 java singleton multithreading
使用线程,我有一个主要的class(SlaveCrawler)实例化三个类(Downloader, ContentAnalyzer, URLAnalyzer),它们相互依赖.
SlaveCrawler用途Downloader和URLAnalyzer
Downloader用途ContentAnalyzer和URLAnalyzer
ContentAnalyzer 使用 URLAnalyzer
我只想要每个类的一个实例.如果我使用Singleton,我可以得到这个,但使用线程,我将有20 SlaveCrawlers(示例),所以我想要20 URLAnalyzer.
有可能使用Singleton或我需要其他方式吗?
nic*_*ild 22
看一下ThreadLocal.每个线程都有自己的每个对象的本地副本.
ThreadLocal<YourObject> threadLocalYourObject = new ThreadLocal<YourObject>() {
@Override
protected YourObject initialValue() {
//initialize YourObject
}
}
Run Code Online (Sandbox Code Playgroud)
或者在1.8中我们可以使用:
ThreadLocal<YourObject> threadLocalYourObject = ThreadLocal.withInitial( () -> new YourObject() )
Run Code Online (Sandbox Code Playgroud)
要访问ThreadLocal对象,请使用get()方法.
YourObject yourObject = threadLocalYourObject.get();
Run Code Online (Sandbox Code Playgroud)
你可以用ThreadLocal来实现它。这是伪代码:
public class ThreadLocalTest {
public static void main(String[] args){
MyTLSingleTon obj = MyTLSingleTon.getInstance();
}
}
class MyTLSingleTon{
private MyTLSingleTon(){
}
private static final ThreadLocal<MyTLSingleTon> _localStorage = new ThreadLocal<MyTLSingleTon>(){
protected MyTLSingleTon initialValue() {
return new MyTLSingleTon();
}
};
public static MyTLSingleTon getInstance(){
return _localStorage.get();
}
}
Run Code Online (Sandbox Code Playgroud)
MyTLSingleTon.getInstance();方法将返回与当前线程关联的对象。如果没有关联对象,protected MyTLSingleTon initialValue()则将调用方法并设置一个新实例。