1.饿汉式(静态常量)
public class Singleton {
private final static Singleton SINGLETON = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return SINGLETON;
}
}
总结:该方法比较勤快,每次类被jvm装载时类就被初始化,所以缺点就来了可能导致有时没被用到,造成没必要的浪费。
2.懒汉式(线程不安全)
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
总结:这个方法就比较懒了,每次只有调用方法时才会创建对象,但只合适在单线程情况下使用,如果有多个线程的话在执行到if判断时, 会发生多个线程进入判断创建出多个实例,不推荐使用。
3.(线程安全)
public class Singleton {
private static volatile Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
总结:该方法是常用的线程安全方法,通过双重判断和synchronized锁保证线程安全,对象只创建一次,下个线程再进来时通过if(singleton == null) 直接返回对象,volatile的意思就是(在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞)具体可以搜索下java内存模型。
个人总结:以上三种方法只是个人学习的一些总结,网上单例有很多方式,我个人觉得这三个就够用了,加油,坚持是一种强大的方式。