• 创建型模式——单例模式(Singleton)


    饿汉式

    /**
     * 饿汉式
     * 类加载到内存后,就实例化一个单例,JVM保证线程安全
     * 简单实用,推荐使用!
     * 唯一缺点:不管用到与否,类装载时就完成实例化
     * Class.forName("")
     * (话说你不用的,你装载它干啥)
     */
    public class Mgr01 {
        private static final Mgr01 INSTANCE = new Mgr01();
    
        private Mgr01() {};
    
        public static Mgr01 getInstance() {
            return INSTANCE;
        }
    
        public void m() {
            System.out.println("m");
        }
    
        public static void main(String[] args) {
            Mgr01 m1 = Mgr01.getInstance();
            Mgr01 m2 = Mgr01.getInstance();
            System.out.println(m1 == m2);
        }
    }

    懒汉模式

    /**
     * lazy loading
     * 也称懒汉式
     * 虽然达到了按需初始化的目的,但却带来线程不安全的问题
     * 可以通过synchronized解决,但也带来效率下降
     */
    public class Mgr06 {
        private static volatile Mgr06 INSTANCE; //JIT
    
        private Mgr06() {
        }
    
        public static Mgr06 getInstance() {
            if (INSTANCE == null) {
                //双重检查
                synchronized (Mgr06.class) {
                    if(INSTANCE == null) {
                        try {
                            Thread.sleep(1);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        INSTANCE = new Mgr06();
                    }
                }
            }
            return INSTANCE;
        }
    
        public void m() {
            System.out.println("m");
        }
    
        public static void main(String[] args) {
            for(int i=0; i<100; i++) {
                new Thread(()->{
                    System.out.println(Mgr06.getInstance().hashCode());
                }).start();
            }
        }
    }

    静态内部类方式

    /**
     * 静态内部类方式
     * JVM保证单例
     * 加载外部类时不会加载内部类,这样可以实现懒加载
     */
    public class Mgr07 {
    
        private Mgr07() {
        }
    
        private static class Mgr07Holder {
            private final static Mgr07 INSTANCE = new Mgr07();
        }
    
        public static Mgr07 getInstance() {
            return Mgr07Holder.INSTANCE;
        }
    
        public void m() {
            System.out.println("m");
        }
    
        public static void main(String[] args) {
            for(int i=0; i<100; i++) {
                new Thread(()->{
                    System.out.println(Mgr07.getInstance().hashCode());
                }).start();
            }
        }
    
    
    }

    终极写法

    Java创始人写的 来源书籍  Effective Java

    /**
     * 不仅可以解决线程同步,还可以防止反序列化。
     */
    public enum Mgr08 {
    
        INSTANCE;
    
        public void m() {}
    
        public static void main(String[] args) {
            for(int i=0; i<100; i++) {
                new Thread(()->{
                    System.out.println(Mgr08.INSTANCE.hashCode());
                }).start();
            }
        }
    
    }
    注重细节——关注底层——注重细节——关注底层——注重细节——关注底层——注重细节——关注底层——注重细节——关注底层
  • 相关阅读:
    Linux 显示当前时间
    Jenkins 更改工作目录;
    Jenkins 编译 .net 项目
    Jenkins 通过 maven 构建编译 JAVA 项目环境
    Jenkins
    Zatree
    Zabbix 邮件报警示例
    Zabbix 短信报警示例
    Linux 检测出口IP地址
    数据结构与算法面试题80道(4)
  • 原文地址:https://www.cnblogs.com/PJG20/p/14176430.html
Copyright © 2020-2023  润新知