• 设计模式之单例模式


    定义

           单例模式属于创建型模式,是设计模式中最简单的设计模式之一,其最大的特点是只有一个实例。当某一个类频繁被其他对象进行调用,为减少该类被频繁的创建和销毁,单例模式则派上用场。

           单例模式主要处理多个线程的统一操作,比如计数器的实现、多线程对于统一文件的操作等等。但是单例模式的实现与Java设计原则中的单一职责原则相冲突。

    实现

           单例模式的实现有很多种,比如饿汉模式、懒汉模式、静态内部类,甚至枚举值实现等。每种实现方式各有特点,对于线程安全和是否延迟加载也各有不同。下面分别对于其多种实现方式进行简单介绍和实现。

      饿汉模式

    /**
     * 单例模式--饿汉模式: 线程安全的
     */
    public class SingletonDemoHungry {
    
        private static SingletonDemoHungry instance = new SingletonDemoHungry();
    
        private SingletonDemoHungry() {
        }
    
        public static SingletonDemoHungry getInstance(){
            return instance;
        }
    }

      懒汉模式

    /**
     * 单例模式--懒汉模式: 线程安全的
     *
     * 双重校验锁的方法: 在多线程的情况下, 保证代码块只能被一个线程锁定
     * volatile: 可以防止指令重排, 即保证在 写 操作之前,不会进行读操作
     *
     */
    public class SingletonDemoLazy {
    
        private volatile static SingletonDemoLazy instance = null;
    
        private SingletonDemoLazy() {
        }
    
        public static SingletonDemoLazy getInstance(){
            if (instance == null){
                synchronized (SingletonDemoLazy.class){
                    if (instance == null){
                        instance =  new SingletonDemoLazy();
                    }
                }
            }
            return instance;
        }
    }

      静态内部类

    /**
     * 单例模式--静态内部类: 线程安全的
     *
     * 静态内部类的方式:只有在调用getInstance() 方法时才会去加载,类似于懒汉模式
     * 它是线程安全的
     */
    public class SingletonDemoStaticClass {
    
        //内部类
        private static class SingletonClassHolder{
            private static SingletonDemoStaticClass instance = new SingletonDemoStaticClass();
        }
    
        private SingletonDemoStaticClass() {
        }
    
        //外部调用获取该类的方法时才会调用静态内部类的方法
        public static SingletonDemoStaticClass getInstance(){
    
            return SingletonClassHolder.instance;
        }
    }

      枚举值

    /**
     * 单例模式--枚举方法, 线程安全
     *
     * 外部调用它的方法直接通过 SingletonDemoEnum.INSTANCE.itsMethod() 即可
     */
    public enum SingletonDemoEnum {
        INSTANCE;
    
        public void itsMethod(){
            System.out.println("itsMethod has been called! ");
        }
    }
  • 相关阅读:
    广度优先搜索-八数码问题
    广度优先搜索-鸣人和佐助
    广度优先搜索-迷宫问题
    广度优先搜索-抓住那头牛
    Unity面试题汇总(第一部分)
    独立项目-Socket通讯 应用/客户端和服务器的简单通讯-04
    独立项目-Socket通讯 服务器端代码-04
    独立项目-Socket通讯 客户端代码-03
    独立项目-Socket通讯 发送数据包和接收数据包过程图-02
    独立项目-Socket通讯 服务器端架构图-01
  • 原文地址:https://www.cnblogs.com/Demrystv/p/11948974.html
Copyright © 2020-2023  润新知