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

    1.什么是单列模式

      说简单点就是确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例

      比如:线程池、日志对象   这些都是被设计成单列

    2.单列模式的特点

      -有且只有一个实例

      -必须自己创建自己唯一的实例

      -必须给其他所有的对象提供这一实例

      -单列模式保证全局对象的唯一性

    3.线程安全问题

      在使用单例对象的时候,要注意单例对象内的实例变量是会被多线程共享的,推荐使用无状态的对象,

      不会因为多个线程的交替调度而破坏自身状态导致线程安全问题,

      比如我们常用的VO,DTO等(局部变量是在用户栈中的,而且用户栈本身就是线程私有的内存区域,所以不存在线程安全问题)。

    4.实现单列的方式

      1.饿汉式单列(立即加载)    

    // 饿汉式单例
    public class Singleton1 {
        // 私有构造
        private Singleton1() {}
    
        private static Singleton1 single = new Singleton1();
    
        // 静态工厂方法
        public static Singleton1 getInstance() {
            return single;
        }
    }
    

      

      饿汉式单例在类加载初始化时就创建好一个静态的对象供外部使用,除非系统重启,这个对象不会改变,所以本身就是线程安全的。

      Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。

      事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且闭着眼就认为反射机制不存在。)

      2.懒汉式单列(延迟加载)

      

    // 懒汉式单例
    public class Singleton2 {
    
        // 私有构造
        private Singleton2() {}
    
        private static Singleton2 single = null;
    
        public static Singleton2 getInstance() {
            if(single == null){
                single = new Singleton2();
            }
            return single;
        }
    }
  • 相关阅读:
    几句让自己保留的动力的格言
    repo 的几个使用理解
    (转)汇编中断大全
    (转) 汇编.section和.text解释
    find 命令一些小技巧;
    android 系统使用c语言获取系统属性
    新的起点
    PDBC详细介绍
    PDBC(连接数据库)
    Python——基础知识
  • 原文地址:https://www.cnblogs.com/qi2332356/p/11018324.html
Copyright © 2011-2022 走看看