懒汉式(使用时才创建)
public class Singleton {
//3 由于getInstance的方法是静态的,静态方法中的内容必须为静态属性,所以singleton这个属性也必须是static
private static Singleton singleton;
//1 因为单例特性是只有一个实例对象,所以不希望外部随意new实例对象,所以构造器私有化
private Singleton() {
}
//2 因为构造器私有,外部无法new Singleton(),所以想要得到这个方法,必须使得这个方法为静态方法
private static Singleton getInstance() {
if(singleton == null)
singleton = new Singleton();
return singleton;
}
}
饿汉式(类加载时就创建了)
public class Singleton2 {
//由于getInstance的方法是静态的,静态方法中的内容必须为静态属性,所以singleton这个属性也必须是static
private static Singleton2 singleton = new Singleton2();
//因为单例特性是只有一个实例对象,所以不希望外部随意new实例对象,所以构造器私有化
private Singleton2() {
}
//因为构造器私有,外部无法new Singleton(),所以想要得到这个方法,必须使得这个方法为静态方法
private static Singleton2 getInstance() {
return singleton;
}
}
双重检查
public class Singleton {
//由于getInstance的方法是静态的,静态方法中的内容必须为静态属性,所以singleton这个属性也必须是static
private static Singleton singleton;
//因为单例特性是只有一个实例对象,所以不希望外部随意new实例对象,所以构造器私有化
private Singleton() {
}
//因为构造器私有,外部无法new Singleton(),所以想要执行这个方法得到单例,必须使得这个方法为静态方法
private static Singleton getInstance() {
if(singleton == null) {//当有两个线程在这里等待时,其中一个先执行,若没有第二层判断,则会创建两个实例对象
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}