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

    单例模式

    介绍

    • 模式:创建型
    • 意图:保证一个类只有一个实例,并提供一个访问它的全局访问点
    • 解决:一个全局使用的类频繁地创建与销毁
    • 场景:
      • 唯一序列号
      • web中的计数器
      • I/O与数据库的连接
      • ……  

    实现方式

    • 饿汉式 :静态加载,线程安全

     1 /**
     2  * 单例模式:饿汉式
     3  * 是否Lazy初始化:否
     4  * 是否多线程安全:是
     5  */
     6 public class Singleton {
     7 
     8     private static Singleton singleton = new Singleton();
     9 
    10     // 构造器私有
    11     private Singleton() {
    12     }
    13 
    14     // 实例方法
    15     public static Singleton getInstance() {
    16         return singleton;
    17     }
    18 }
    Singleton.java
    • 懒汉式:单校验,线程不安全

     1 /**
     2  * 单例模式:懒汉式
     3  * 是否Lazy初始化:是
     4  * 是否多线程安全:否
     5  */
     6 public class Singleton {
     7 
     8     private static Singleton singleton;
     9 
    10     // 构造器私有
    11     private Singleton() {
    12 
    13     }
    14 
    15     // 实例方法
    16     public static Singleton getInstance() {
    17         if (singleton == null) {
    18             return new Singleton();
    19         }
    20         return singleton;
    21     }
    22 }
    Sington.java
    • 懒汉式:实例方法同步锁,线程安全

     1 /**
     2  * 单例模式:懒汉式
     3  * 是否Lazy初始化:是
     4  * 是否多线程安全:是
     5  */
     6 public class Singleton {
     7 
     8     private static Singleton singleton;
     9 
    10     // 构造器私有
    11     private Singleton() {
    12 
    13     }
    14 
    15     // 实例方法
    16     public static synchronized Singleton getInstance() {
    17         if (singleton == null) {
    18             return new Singleton();
    19         }
    20         return singleton;
    21     }
    22 }
    Sington.java
    • 懒汉式:双检锁/双重校验锁(DCL,double-checked locking),线程安全

     1 /**
     2  * 单例模式:懒汉式
     3  * 是否Lazy初始化:是
     4  * 是否多线程安全:是
     5  */
     6 public class Singleton {
     7 
     8     private static volatile Singleton singleton;
     9 
    10     // 构造器私有
    11     private Singleton() {
    12 
    13     }
    14 
    15     // 实例方法
    16     public static Singleton getInstance() {
    17         if (singleton == null) {
    18             synchronized (Singleton.class) {
    19                 if (singleton == null) {
    20                     return new Singleton();
    21                 }
    22             }
    23         }
    24         return singleton;
    25     }
    26 }
    Sington.java
    • 登记式/静态内部类:线程安全

     1 /**
     2  * 单例模式:登记式/静态内部类
     3  * 是否Lazy初始化:是
     4  * 是否多线程安全:是
     5  */
     6 public class Singleton {
     7 
     8     // 静态内部类持有
     9     private static class SingletonHolder {
    10         private static final Singleton SINGLETON = new Singleton();
    11     }
    12 
    13     // 构造器私有
    14     private Singleton() {
    15 
    16     }
    17 
    18     // 实例方法
    19     public static Singleton getInstance() {
    20         return SingletonHolder.SINGLETON;
    21     }
    22 }
    Sington.java
    • 枚举:线程安全

    1 /**
    2  * 单例模式:枚举
    3  * 是否Lazy初始化:否
    4  * 是否多线程安全:是
    5  */
    6 public enum Singleton {
    7     SINGLETON
    8 }
    Singleton.java

    资料来源:阿里云大学 - 设计模式

  • 相关阅读:
    学习软件工程的个人总结
    结对编程——黄金点游戏
    读取程序字符,行数,单词的个人程序
    c#代码分析
    Visual Studio2013的安装过程及练习测试
    小学三年级出题程序
    超级课程表的个人评价
    对软件工程的个人困惑
    个人附加作业
    个人最终总结
  • 原文地址:https://www.cnblogs.com/brucevon/p/10033144.html
Copyright © 2011-2022 走看看