在Java中,每个线程都有可能的单例吗?

2022-09-03 12:17:38

使用线程,我有一个主类()来实例化三个类(),它们相互依赖。SlaveCrawlerDownloader, ContentAnalyzer, URLAnalyzer

SlaveCrawler用途和DownloaderURLAnalyzer

Downloader用途和ContentAnalyzerURLAnalyzer

ContentAnalyzer使用URLAnalyzer

我只想要每个类的一个实例。如果我使用,我可以得到这个,但是使用线程,我将有20个(示例),所以我想要20个。SingletonSlaveCrawlersURLAnalyzer

有可能使用或我需要其他方式?Singleton


答案 1

看看ThreadLocal。每个线程将具有每个对象的本地副本。

ThreadLocal<YourObject> threadLocalYourObject = new ThreadLocal<YourObject>() {
  @Override
  protected YourObject initialValue() {
    //initialize YourObject
  }
}

或者在1.8中,我们可以使用:

ThreadLocal<YourObject> threadLocalYourObject = ThreadLocal.withInitial( () -> new YourObject() )

要访问 ThreadLocal 对象,请使用 get() 方法。

YourObject yourObject = threadLocalYourObject.get();

答案 2

您可以使用 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();
  }
}

MyTLSingleTon.getInstance();方法将返回与当前线程关联的对象。如果没有关联对象,则将调用方法并设置一个新实例。protected MyTLSingleTon initialValue()


推荐