单例模式,顾名思义,一个类最多只能有一个实例。
有几种方式的单例实现方式,下面开门见山,上代码。
懒汉单例
懒汉很懒,在你要调用获得对象实例的方法时候才创建。
public class LazySingleton {
private static LazySingleton lazy;
private LazySingleton(){}
public static LazySingleton getInstance(){
if(lazy==null){lazy=new LazySingleton();}
return lazy;
}
}
饿汉单例
饿汉很饿,类中第一句就迫不及待的要创建对象来填肚子。
public class HungrySingleton {
private static final HungrySingleton hungry=new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance(){
return hungry;
}
}
以上两个单例类比较简单,但是存在一些问题:①对于懒汉单例类,当程序执行到创建对象语句,但对象还未被创建好的时候,如果此时再次调用getInstance()方法,此时!=null判断结果仍然为true,如此便导致了单例类”不单了“。可以用Synchronized关键字修饰方法getInstance()来实现同步解决这个问题。
②饿汉模式比较奢侈,因为存在不需要实例的情况,在这种情况下它的创建就显得多余。
--------------------------------下面补充两个懒汉模式的实现-------------------------------------
public class LazySingleton {
private static LazySingleton lazy;
private LazySingleton() {
}
public static LazySingleton getInstance() {
if (lazy == null) {
synchronized (LazySingleton.class) {
lazy = new LazySingleton();
}
}
return lazy;
}
}
比synchronized整个方法开销小一些,但存在同步问题,改进如下----》
public class LazySingleton {
private static LazySingleton lazy;
private LazySingleton() {
}
public static LazySingleton getInstance() {
if (lazy == null) {
synchronized (LazySingleton.class) {
if (lazy == null) {
lazy = new LazySingleton();
}
}
}
return lazy;
}
}
这个叫 双重检查锁定。
-----------------------------------------------------------------------------------------------------------------------------------------------
不知有没有发现以上的类成员变量都定义成了static,这是为什么呢?这要从头说起,因为单例类没有实例,所以获得实例的方法必须是static(这样才能不创建实例调用该方法)。又因为static方法只能操作static成员,所以类成员变量都定义成了static。(直接return new ()除外)