1、饿汉式 在类加载的时候完成 类的初始化。
1.1 静态代码块 获取 对象
1.2 直接 new 一个对象
结论 可以用 可能会造成 内存的 浪费 (这个类 可能会被别的方式 初始化 比如 子类 被初始化 通过反射,或者调用 这个类的静态方法)
2、懒汉式
在使用 获取对象的方法时返回一个对象。线程不安全。 开发时不用
在使用 获取对象的方法时可以加个同步的 synchronized 解决线程安全 问题 效率太低 不使用。
3、双重锁模式
判断 对象是不是空 是空的化 进入一个同步方法 方法里面 由判断了下 对象 是空就 new 对象 是推荐使用的。解决线程安全问题 和 实现懒加载。
4、静态内部类的方式
推荐使用 外部类加载的时候内部类不一定加载 只有在使用到内部类的时候才加载 jvm加载类 是线程安全的。解决线程安全问题,和实现懒加载。
5、枚举类的方式获取对象
推荐使用 解决线程安全问题 代码如下
public enum Singleton {
INSTANCE;
public void sayHello(){
System.out.println("ok");
}
}
public class Test {
public static void main(String[] args) {
System.out.println("枚举的方式创建单例");
Singleton singleton = Singleton.INSTANCE;
Singleton singleton1 = Singleton.INSTANCE;
System.out.println(singleton == singleton1); //true
}
}
来源:https://www.cnblogs.com/gaohq/p/11962967.html