设计模式

单例模式

介绍

  • 模式:创建型
  • 意图:保证一个类只有一个实例,并提供一个访问它的全局访问点
  • 解决:一个全局使用的类频繁地创建与销毁
  • 场景:
    • 唯一序列号
    • 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

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

原文地址:https://www.cnblogs.com/brucevon/p/10033144.html