zoukankan      html  css  js  c++  java
  • 创建型模式——单例模式(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();
            }
        }
    
    }
    注重细节——关注底层——注重细节——关注底层——注重细节——关注底层——注重细节——关注底层——注重细节——关注底层
  • 相关阅读:
    iOS 针对txt文档进行解码
    iOS导入其他APP下载的文件(用其他应用打开)
    地图定位
    NSURLSession
    利用box-shadow属性实现页面层叠效果
    利用vue-router和compoment重构代码--踩坑(一)
    markdown 一分钟入门
    webpack,配置,上手,例子
    在搜索框里添加放大镜的图标,且显示提示信息
    css3实现checkbox变开关按钮
  • 原文地址:https://www.cnblogs.com/PJG20/p/14176430.html
Copyright © 2011-2022 走看看