1.多线程安全单例模式实例一(不使用同步锁)
这种方式在
public class Singleton {
private static Singleton instance = new Singleton(); //直接初始化一个实例对象
private Singleton(){
//private类型的构造函数,保证其他类对象不能直接new一个该对象的实例
}
public static Singleton getInstance(){//该类唯一的一个public方法
return instance;
}
}
上述代码中的一个缺点是该类加载的时候就会直接new 一个静态对象出来,当系统中这样的类较多时,会使得启动速度变慢 。现在流行的设计都是讲“延迟加载”,我们可以在第一次使用的时候才初始化第一个该类对象。所以这种适合在小系统。
2. 多线程安全单例模式实例二(使用同步方法)
public class Singleton {
private static Singleton instance;
private Singleton(){
//private类型的构造函数,保证其他类对象不能直接new一个该对象的实例
}
public synchronized static Singleton getInstance(){//该类唯一的一个public方法
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
由于对getInstance()方法做了同步处理,synchronized将导致性能开销。如果getInstance()方法被多个线程频繁的调用,将会导致程序执行性能的下降。反之,如果getInstance()方法不会被多个线程频繁的调用,那么这个初始化方案将能提供令人满意的性能。
3. 多线程安全单例模式实例三(使用双重同步锁)
public class Singleton {
/**
* 注意这里必须使用volatile,否则在多线程并发情况下,可能由于A线程中instance已经分配了内存空间,
* 而instance还没有完成初始化,而B线程判断到 instance不为null,直接获取instance对象;
* 详细解说可以参看《Java并发编程的艺术》3.8节
*/
private volatile static Singleton instance;
private Singleton(){
//private类型的构造函数,保证其他类对象不能直接new一个该对象的实例
}
public static Singleton getInstance(){//该类唯一的一个public方法
if(instance == null){
synchronized (Singleton.class) {
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}