• 单例模式(懒汉、饿汉、同步锁、static、枚举)实现


    使用前提:

      需要频繁的进行创建和销毁的对象,创建对象时耗时过多或耗费资源过多

    三要素:

    • 1、构造方法私有化;
    • 2、实例化的变量引用私有化;
    • 3、获取实例的方法共有。

    1.饿汉式单例

      弊端:在类装载的时候就完成实例化

    /**
     * 饿汉式单例
     * 
     * @author Wonder
     * @history create Wonder 2018年10月24日 上午9:55:32
     * @version 1.0
     */
    public class Singleton1 {
        private Singleton1() {
        }// 1私有化构造
    
        private final static Singleton1 singleton1 = new Singleton1();// 2实例化
    
        public static Singleton1 getInstance() {// 3对外提供
            return singleton1;
        }
    
    }
    View Code

    2.懒汉式单例

      弊端:多线程环境下会产生多个single对象,线程不安全

    /**
     * 懒汉式单例
     * 多线程环境下会产生多个single对象
     * 
     * @author Wonder
     * @history create Wonder 2018年10月24日 上午10:17:59
     * @version 1.0
     */
    public class Singleton2 {
        private Singleton2() {
        }// 1私有化构造
    
        private static Singleton2 singleton2 = null;// 延迟实例
    
        public static Singleton2 getInstance() {
            if (singleton2 == null) {
                singleton2 = new Singleton2();
            }
            return singleton2;
        }
    }
    View Code

    3.懒汉式单例(synchronized同步锁)

      弊端:效率低

        同步方法的方式:获取实例时,每次都要执行同步方法,效率太低

        同步代码块的方式:可能多个线程同时进入if判断,实际页无法起到线程同步的作用

    /**
     * 懒汉式单例 只对需要锁的代码部分加锁
     * 
     * @author Wonder
     * @history create Wonder 2018年10月24日 上午10:17:59
     * @version 1.0
     */
    public class Singleton4 {
        private Singleton4() {
        }// 1私有化构造
    
        private static Singleton4 single = null;// 延迟实例
    
        public static Singleton4 getInstance() {
            if (single == null) {
                synchronized (Singleton4.class) {
                    single = new Singleton4();
                }
            }
            return single;
        }
    }
    View Code

    4.双重检查

      1.使用volatile关键字,防止防止 JVM 进行指令重排优化

      2.进行了两次if (singleton == null)检查,如果为null,同步代码块,创建实例,否则直接返回singleton实例

    public 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;
        }
    }
    View Code

    5.静态代码块和静态内部类

      静态代码块的方式

    public class Singleton5 {
        private Singleton5() {
        }// 1私有化构造
    
        private static Singleton5 single = null;// 延迟实例
    
        // static静态代码块
        static {
            single = new Singleton5();
        }
    
        public static Singleton5 getInstance() {
            return single;
        }
    }
    View Code

      静态内部类方式更优(懒加载)

        静态内部类方式在Singleton类被装载时并不会立即实例化

    public class Singleton {
    
        private Singleton() {}
    
        private static class SingletonInstance {
            private static final Singleton INSTANCE = new Singleton();
        }
    
        public static Singleton getInstance() {
            return SingletonInstance.INSTANCE;
        }
    }
    View Code

    6.枚举实现

      简单枚举方式:

    public enum Singleton {
        INSTANCE;
        public void whateverMethod() {
    
        }
    }
    View Code

      优化:内部枚举类

    public class SingletonFactory {
    
        // 内部枚举类
        private enum EnmuSingleton {
            SINGLETON;
            private Singleton6 single;
    
            // 枚举类的构造方法在类加载是被实例化
            private EnmuSingleton() {
                single = new Singleton6();
            }
    
            public Singleton6 getInstance() {
                return single;
            }
    
        }
    
        public static Singleton6 getInstance() {
            return EnmuSingleton.SINGLETON.getInstance();
        }
    }
    
    class Singleton6 {
        public Singleton6() {
        }
    }
    View Code
  • 相关阅读:
    软件工程实践总结作业
    SDN第4次上机作业
    SDN第四次作业
    SDN第三次上机作业
    SDN第三次作业
    SDN第二次上机作业
    SDN第一次上机作业
    免费自动生成字幕工具推荐,啃生肉啊(6.12更新)
    博客园美化,自定义你的博客,css+html (iframe)
    找质数、素数_算法优化(C++)
  • 原文地址:https://www.cnblogs.com/soul-wonder/p/9851611.html
Copyright © 2020-2023  润新知