在Java中,每个线程可能有Singleton吗?

Ren*_*ani 14 java singleton multithreading

使用线程,我有一个主要的class(SlaveCrawler)实例化三个类(Downloader, ContentAnalyzer, URLAnalyzer),它们相互依赖.

SlaveCrawler用途DownloaderURLAnalyzer

Downloader用途ContentAnalyzerURLAnalyzer

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)

  • 你不必明确地保留一份`YourObject`.此外,您不需要实现get()方法(实际上,此解决方案将始终为所有线程返回相同的副本.) (2认同)

Nir*_*hah 5

你可以用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()则将调用方法并设置一个新实例。