zoukankan      html  css  js  c++  java
  • 单例设计模式

    1单例模式概述

    单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。
    通常单例模式在Java语言中,有两种构建方式:
    懒汉方式:指全局的单例实例在第一次被使用时构建。
    饿汉方式:指全局的单例实例在类装载时构建
    单例模式在构建的时候主要包括以下两个步骤
    1、私有化构造方法
    2、提供一个静态方法

    2 实例

    1、懒汉式

    public class Singleton1 {
        private final static Singleton1 SINGLETON_1 = new Singleton1();
    
        private Singleton1() {
    
        }
    
        public static Singleton1 getSingleton1() {
            return SINGLETON_1;
        }
    }
    

    线程安全,在类装载的时候实例化对象,避免线程同步的问题
    2、懒汉式

    public class Singleton2 {
        private static Singleton2 singleton2;
    
        static {
            singleton2 = new Singleton2();
        }
    
        private Singleton2() {
    
        }
    
        public static Singleton2 getSingleton2() {
            return singleton2;
        }
    }
    

    线程安全,在类装载的时候实例化对象,避免线程同步的问题
    3、饿汉式

    public class Singleton3 {
        private static Singleton3 singleton3 = null;
    
        private Singleton3() {
    
        }
    
        public static Singleton3 getSingleton3() {
            if (singleton3 == null) {
                singleton3 = new Singleton3();
            }
            return singleton3;
        }
    }
    

    线程不安全,最好不要这样写
    4、饿汉式

    public class Singleton4 {
        private static Singleton4 singleton4 = null;
    
        private Singleton4() {
    
        }
    
        public static synchronized Singleton4 getSingleton4() {
            if (singleton4 == null) {
                singleton4 = new Singleton4();
            }
            return singleton4;
        }
    }
    

    线程安全,但是在多线程环境下效率并不高
    5、双重校验锁

    public class Singleton5 {
        private volatile static Singleton5 singleton5 = null;
    
        private Singleton5() {
    
        }
    
        public static Singleton5 getSingleton5() {
            if (singleton5 == null) {
                synchronized (Singleton5.class) {
                    if (singleton5 == null) {
                        singleton5 = new Singleton5();
                    }
                }
            }
            return singleton5;
        }
    }
    

    使用双重校验锁,线程安全
    6、枚举类

    public enum  Singleton6 {
        SINGLETON_6;
        public void whateverMethod() {
    
        }
    
    }
    

    枚举类,线程安全
    7、静态内部类

    public class Singleton7 {
        private Singleton7() {
    
        }
    
        private static class Singleton7Instance {
            private static final Singleton7 SINGLETON_7 = new Singleton7();
    
        }
    
        public static Singleton7 getSingleton7() {
            return Singleton7Instance.SINGLETON_7;
        }
    }
    

    8、

  • 相关阅读:
    46. 全排列
    90. 子集 II
    289. 生命游戏
    844. 比较含退格的字符串
    1266. 访问所有点的最小时间
    707. 设计链表
    DOM 关于dom的
    插件库
    浏览器判断
    FTP 客户端安装
  • 原文地址:https://www.cnblogs.com/haizhilangzi/p/10920001.html
Copyright © 2011-2022 走看看