zoukankan      html  css  js  c++  java
  • 设计模式-单例模式(Singleton)

    单例模式

    单例模式(Singleton)是设计模式中最简单的一个,他的设计原则是保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。

    一下是五种单列设计写法

    方法一

    public class Main {
        private static final Main INSTANCE = new Main();
    
        private Main() {};
    
        public static Main getInstance() {
            return INSTANCE;
        }
    
        public void m() {
            System.out.println("m");
        }
    }
    

    构造方法只构造一次,可以使用private方法限制掉。类加载内存后,就实例话一个单列,JVM保证线程安全。

    缺点:不管用到与否,类加载时就完成实例。

    方法二

    public class Main {
        private static final Main INSTANCE;
        static {
            INSTANCE = new Main();
        }
    
        private Main() {};
    
        public static Main getInstance() {
            return INSTANCE;
        }
    
        public void m() {
            System.out.println("m");
        }
    }
    

    与第一种类似

    方法三

    public class Main {
        private static Main INSTANCE;
    
        private Main() {
        }
    
        public static synchronized Main getInstance() {
            if (INSTANCE == null) {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                INSTANCE = new Main();
            }
            return INSTANCE;
        }
    }
    

    此方法类在需要的时候加载,虽然达到了按需初始化的目的,但却带来线程不安全的问题
    可以通过synchronized解决,但也带来效率下降

    方法四

    public class Main {
        // 添加valatile,防止重排
        private static volatile Main INSTANCE;
    
        private Main() {
        }
    
        public static Main getInstance() {
            if (INSTANCE == null) {
                //双重检查
                synchronized (Main.class) {
                    if(INSTANCE == null) {
                        try {
                            Thread.sleep(1);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        INSTANCE = new Main();
                    }
                }
            }
            return INSTANCE;
        }
    }
    

    虽然问题得已解决,但也带来效率下降。

    方法五

    public class Main {
    
        private Main() {
        }
    
        private static class MainHolder {
            private final static Main INSTANCE = new Main();
        }
    
        public static Mgr07 getInstance() {
            return MainHolder.INSTANCE;
        }
    }
    

    静态内部类方式
    JVM保证单例
    加载外部类时不会加载内部类,这样可以实现懒加载
    这种写法更好一些

  • 相关阅读:
    win10下安装scrapy不成功的问题解决
    python方法和函数区别
    关于Django 报错 ImportError: cannot import name RegexUrlResolver解决
    Django+Vue后端解决跨域问题
    python中yield的用法
    启动后、路由加载之前定制一段代码(基于admin原理)
    Hadoop期末复习
    python爬虫期末复习
    idea开发环境搭建ssh
    intelliJ破解及JavaEE搭建
  • 原文地址:https://www.cnblogs.com/ilyar1015/p/15080325.html
Copyright © 2011-2022 走看看