单例模式 的应用场景是: 有的时候只需要在内存中保有该类的一份实例,如资源配置类。
单例模式要求:
1. 单例类 只有一个 实例
2.构造方法是私有的,这样的话,外部无法new出一个实例
3.单例类必须提供一个别人得到实例的静态方法
4.必须解决多线程下的同步问题
5.分为懒汉式和饿汉式实现方式
一:下面先看看懒汉式的实现方法,何为懒汉,就是自己不先主动生成一个实例,而是等到用户使用的时候来判断,判断如果实例还为空,那么就new一个。
public class Singleton(){
public static Singleton s = null;
private Singleton(){//构造方法必须为私有,这样外部无法new出实例
}
//提供一个外部获取实例的静态方法,必须为静态的,因为外部new 不出对象,只能通过类来直接调用静态方法。
public static synchronized Singleton getInstance(){
if(s == null){
s = new Singleton();
}
return s;
}
}
//synchronize 必须添加。因为懒汉式就是存在多线程的同步问题,我们来看一种情况
比如 某线程调用 getInstance方法的时候,还没来得及判断你,另外一个线程就进来了,此时2个线程都认为实例为Null,于是各自去new各自的实例,最终就不是单例了
二:饿汉式就比较直接了。何为饿汉,就是很饿,一进来就找实例,自己直接动手new了。不用等到实际需要的时候才去new
public class Singleton(){
private static final Singleton s = new Singleton();
private Singleton();
public static Singleton getInstance(){
return s;
}
}
}
饿汉和懒汉的最大区别就是 一个线程安全,一个线程不安全。