单例模式的作用:
- 保证全局只存在该类的唯一一个对象,唯一的对象的引用。
- 系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
单例类的实现规则:
- 1:构造方法的私有化,不通过构造方法实例化该对象
- 2:通过静态方法的方式获取该类的实例化对象引用,如果存在实例化对象,则直接调用,否则创建唯一的实例化对象
一:饿汉式(静态常量)
在类加载的时候实例化该类,避免了线程同步的问题
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return INSTANCE;
}
}
二:饿汉式(静态代码块)
public class Singleton {
private static Singleton instance;
static {
instance = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
三:懒汉式(线程安全的的,懒加载)
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;
}
}
四:静态内部类(懒加载,线程安全的)
而静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
五:枚举的方式(Enum)
枚举实质上是静态常量,和饿汉模式一样,都是在类加载的时候实例化好对象,避免了线程同步的问题,且还能防止反序列化重新创建新的对象
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
Enum源码:
public class Singleton {
private static final Singleton INSTANCE=new Singleton();
public void whateverMethod() {
}
}