本文最后更新于:4 个月前
单例模式
单例模式有八种方式:
1 2 3 4 5 6 7 8
| 饿汉式 饿汉式 懒汉式 懒汉式 懒汉式 并不能实现线程安全 双重检查 静态内部类 枚举
|
饿汉式(静态常量)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Singleton{ private Singleton(){ } private final static Singleton instance = new Singleton();
public static Singleton getInstance(){ return instance; } }
|
饿汉式(静态代码块)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Singleton{ private Singleton(){} private static Singleton instance ; static{ instance = new Singleton(); }
public static Singleton getInstance(){ return instance; } }
|
懒汉式(线程不安全)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Singleton{ private static Singleton instance; private Singleton(){}
public static Singleton getInstance(){ if (instance == null){ instance = new Singleton(); } return instance; } }
|
懒汉式(线程安全)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Singleton{ private static Singleton instance; private Singleton(){} public static synchronized Singleton getInstance(){ if (instance == null){ instance = new Singleton(); } return instance; } }
|
双重检查(推荐)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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; } }
|
静态内部类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Singleton{ private static volatile Singleton instance; private Singleton(){} private static class SingletonInstance{ private static final Singleton INSTANCE = new Singleton(); } public static synchronized Singleton getInstance(){ return SingletonInstance.INSTANCE; } }
|
枚举
1 2 3 4 5 6 7 8 9 10 11 12 13
| enum Singleton{ INSTANCE; public void sayOK(){ System.out.println("ok~~~"); } }
|
单例模式注意事项和细节说明:
1)单例模式保证了系统内存中 该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可提高系统的性能
2)当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是直接使用new
3)单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或者耗费资源过多(即重量级对象),但又经常用到的对象,工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等)
1 2 3
| 如果确定实例一定会使用 饿汉式是可以使用的 只是有可能会造成内存浪费 比如java的Runtime中就用了饿汉式 推荐使用: 双重检查、静态内部类、枚举
|