一、懒汉式
在第一次调用的时候实例化自己,存在线程安全问题。可以通过在getInstance方法上加同步,或者是在双重检查锁定,或者是静态内部类。
private Singleton(){}
private static Singleton singleton=null;
private static Singleton getInstance(){
if(singleton==null){
singleton=new Singleton();
}else{
return singleton;
}
return singleton;
双重检查锁定的方法:
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
静态内部类:
public class Singleton {
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
二、饿汉式,不存在线程安全问题
private Singleton(){}
private static Singleton single=new Singleton();
private static final Singleton getInstance(){
return single;
}
一般情况下在单例模式下使用getInstance的方法创建对象,但是它与new出来的对象有什么区别?
GetInstance与new区别:
new的使用:如Object object = new Object(),这时候,就必须要知道有第二个public的Object构造方法的
存在。
GetInstance的使用:在主函数开始时调用,返回一个实例化对象,此对象是static的,在内存中保留着它
的引用,即内存中有一块区域专门用来存放静态方法和变量,可以直接使用,调用多次返回同一个对象。
(1)对象使用之前通过getinstance得到,而不需要自己定义,用完之后不需要delete;
(2)new 一定要生成一个新对象,分配内存;getInstance() 则不一定要再次创建,它可以把一个已存在的
引用给你使用,这在效能上优于new;
(3) new创建后只能当次使用,而getInstance()可以跨栈区域使用,或者远程跨区域使用。所以getInstance()
通常是创建static静态实例方法的。