我有一个扩展线程下载文件的类。我想确保一次只进行一次下载,因此我对该类有一个静态引用,并在创建新引用之前检查它是否为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;
}
}