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

    定义

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

           单例模式主要处理多个线程的统一操作,比如计数器的实现、多线程对于统一文件的操作等等。但是单例模式的实现与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! ");
        }
    }
  • 相关阅读:
    汽车档位作用
    大家免着惊
    出头天 闽南语歌词
    Configuration所有配置简介
    android图片缓存框架Android-Universal-Image-Loader
    java泛型 之 入门(interface)
    broadcom6838开发环境实现函数栈追踪
    win 开机 Microsoft corparation 滚动栏
    Linux中下载,压缩,解压等命令
    python实现人人网用户数据爬取及简单分析
  • 原文地址:https://www.cnblogs.com/Demrystv/p/11948974.html
Copyright © 2011-2022 走看看