单例模式

分为饿汉模式及懒汉模式

饿汉模式是初始化时创建。

懒汉模式是使用时创建。

 

饿汉模式:

1
2
3
4
5
6
7
8
9
10
11
public class Student1 {
// 2:成员变量初始化本身对象
private static Student1 student = new Student1();
// 1:构造私有
private Student1() {
}
// 3:对外提供公共方法获取对象
public static Student1 getSingletonInstance() {
return student;
}
}

 

懒汉模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Student5 {
private Student5() {
}
/*
* 此处使用一个内部类来维护单例 JVM在类加载的时候,是互斥的,所以可以由此保证线程安全
问题
*/
private static class SingletonFactory {
private static Student5 student = new Student5();
}
/* 获取实例 */
public static Student5 getSingletonInstance() {
return SingletonFactory.student;
}
}

 

饿汉模式经典的三种实现

1、双重检查锁(DCL)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class DoubleCheckLockSingleton {
  private static volatile DoubleCheckLockSingleton instance;
  private DoubleCheckLockSingleton() {}
  public static DoubleCheckLockSingleton getInstance() {
    if (instance == null) {
      synchronized (DoubleCheckLockSingleton.class) {
        if (instance == null) {
          instance = new DoubleCheckLockSingleton();
       }
     }
   }
    return instance;
 }
  public void tellEveryone() {
    System.out.println("This is a DoubleCheckLockSingleton " +
this.hashCode());
 }
}

其中,synchronized防止CPU指令重排,导致极端情况下,没有初始化完成时,新的子线程就进入到synchronized后了

 

2、静态内部类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class StaticInnerHolderSingleton {
  private static class SingletonHolder {
    private static final StaticInnerHolderSingleton INSTANCE = new
StaticInnerHolderSingleton();
 }
  private StaticInnerHolderSingleton() {}
  public static StaticInnerHolderSingleton getInstance() {
    return SingletonHolder.INSTANCE;
 }
  public void tellEveryone() {
    System.out.println("This is a StaticInnerHolderSingleton" +
this.hashCode());
 }
}

   调用StaticInnerHolderSingleton.getInstance时,内部静态类才会创建,并且线程安全

 

3、枚举模式

1
2
3
4
5
6
public enum EnumSingleton {
  INSTANCE;
  public void tellEveryone() {
    System.out.println("This is an EnumSingleton " + this.hashCode());
 }
}

枚举模式防止被反射攻击和序列化攻击。 因为JVM中,枚举类型不允许进行反射及序列化

 

 

 

 

 

 

posted @   HarkLee  阅读(172)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
历史上的今天:
2019-04-22 windows7搜索python java go php等其他文件内容
2015-04-22 ORCFILE,ParquetFile,CubeFile使用场景区别
点击右上角即可分享
微信分享提示