单例模式:保证一个类只有一个实例,并提供全局的一个访问对象

    优点:
    节省系统资源,不用频繁创建对象
    资源共享,使用同一个实例,不会存在信息不匹配

    实现:
    1、饿加载(饿汉模式)
    即在系统初始化时,便生成对象,线程安全

    1. /**
    2. * 饿加载单例
    3. */
    4. public class HungrySingle {
    5. private static HungrySingle hungrySingle = new HungrySingle();
    6. public static HungrySingle getHungrySingle(){
    7. return hungrySingle;
    8. }
    9. private HungrySingle(){
    10. }
    11. }

    2、懒加载(懒汉模式)
    即系统初始化时不生成对象,使用对象时,才生成对象,线程不安全(当线程A判断对象null时,会去创建对象,这时线程B访问,对象还未创建,线程B会再去创建对象,所以懒加载是线程不安全的

    1. /**
    2. * 懒加载单例
    3. */
    4. public class LazyLoadingSingle {
    5. private static LazyLoadingSingle lazyLoadingSingle;
    6. public static LazyLoadingSingle getLazyLoadingSingle(){
    7. if (lazyLoadingSingle == null){
    8. lazyLoadingSingle = new LazyLoadingSingle();
    9. }
    10. return lazyLoadingSingle;
    11. }
    12. private LazyLoadingSingle(){
    13. }
    14. }

    3、枚举创建
    枚举创建也是线程安全的,这个方法其实是用到了枚举构造方法只会执行一次的特性

    1. /**
    2. * 枚举单例
    3. */
    4. public class EnumSingle {
    5. public static EnumSingle getEnumSingle(){
    6. return DemoSingleEnum.INSTANCE.enumSingle;
    7. }
    8. private enum DemoSingleEnum{
    9. INSTANCE;
    10. private EnumSingle enumSingle;
    11. public EnumSingle getEnumSingle(){
    12. return enumSingle;
    13. }
    14. DemoSingleEnum(){
    15. enumSingle = new EnumSingle();
    16. }
    17. }
    18. private EnumSingle(){
    19. }
    20. }

    最后测试结果,不管方法调用几次,获取到的都是同一个对象
    image.png