我有一个扩展线程下载文件的类。我想确保一次只进行一次下载,因此我对该类有一个静态引用,并在创建新引用之前检查它是否为null。但是,偶尔我会注意到该类的另一个实例已创建,因此在其他线程上进行下载。我试图找出是什么原因引起的,但是,将线程的run()方法标记为要同步(或调用start()的方法)通常不是一个好主意吗?有什么副作用需要注意吗?

最佳答案

您只需要确保在JVM的生命周期内仅创建一个上述对象的实例。为此,有一个非常著名的单例模式可以确保这一点。

将构造函数设为私有。给出一个静态工厂方法来创建实例。

例:

Downloader{

  private static volatile Downloader iDownloader=null;
  private Downloader(){
  }

 public static Downloader createDownloader(){
     if(iDownloader==null){
     synchronized(Downloader.class){
      if(iDownloader==null)
       iDownloader=new Downloader();
       }
      }
  return iDownloader;
}


}

08-17 11:12