1.什么是单利模式?
一个系统中一个类只有一个对象的实例,实现这种功能的方式就叫做单利模式
2.为什么使用单利模式?
节省公共资源,比如一家五口人,每个人都要吃饭,但没必要每个人都用不同的锅来做饭吧,一家人都用同一口锅。
3.单利模式的实现方式
public class Singleton {
//限制实例
private static final Singleton singleton = new Singleton();
//私有化构造方法
private Singleton() {
}
/**
* 类加载时就创建对象,
* @return
*/
public static Singleton getSingleton(){
return singleton;
}
}
//创建测试类,用for循环输出创建的实例
public class test {
public static void main(String[] args) {
for (int i = 0; i <10; i++) {
Singleton singleton = Singleton.getSingleton();
System.out.println(singleton);
}
}
}
输出结果:这里的实例在类初始化时就已经加载完成,不能再进行第二次初始化了


4.单利模式的区别
上述第一个属于饿汉式,并且线程安全,在类加载的时候就完成了初始化,避免了线程同步的问题,缺点是没有起到懒加载的作用,可能会造成资源浪费(没有使用却实例化了)
第二种是懒汉式:代码如下
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
在创建实例时多加了一层判断,虽然起到了懒加载的作用,但是线程不安全,在高并发情况下若一个线程进入if判断切未执行下一步操作,另一个线程也进入if判断,会造成创建多个实例。
解决办法:在创建实例的方法上加synchronized,虽然线程安全了,但是每次获取实例都要进行同步操作,效率极低。
5.使用懒汉式还是饿汉式取决于使用场景,需要根据实际情况选择