java设计模式

faith team

1.懒汉模式:延迟加载,只有在真正使用的时候才进行实例化

  • 1.线程安全问题
  • 2.double check 加锁优化
  • 3.编译器(JIT,CPU)有可能会对指令进行重新排序,导致使用到还没有初始化的实例,可以通过添加volatile关键字进行修饰,对于volatile可以防止重排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class LazySington{
//静态
private volatile static LazySington instance;
private LazySington(){

}
public static LazySington getInstance(){
if (instance == null){
synchronized (LazySington.class){
if (instance == null){
instance = new LazySington();
//字节码层面
//1.开辟空间
//2.初始化
//3。引用赋值
//当 2 和 3 对换的时候 在多线程的情况下线程1进入刚引入赋值 线程2进入发现instance就不是null就返回了 但是这个时候还尚未初始化
}
}
instance = new LazySington();
}
return instance;
}

}

2.饿汉模式

类加载的初始化阶段就完成了实例的初始化。本质上就是借助于jvm类加载机制,保证实例的唯一性。
类加载过程:
1.加载二进制数据到内存中,生成对于的class数据结构
2.连接:a验证 b准备(给类的静态成员变量赋默认值) c解析
3.初始化:给类的静态变量赋初值
只有在真正使用对应类时,才会触发初始化 如(当前类是启动类即main函数所在类,直接进行new操作,访问静态属性、访问静态用法,利用反射访问类,初始化一个类的子类等)

1
2
3
4
5
6
7
8
//饿汉模式
class HungrySingleton{
private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance(){
return instance;
}
}

静态内部类

  • 1.本质上是利用类的加载机制来保证线程安全
  • 2.只有在实际使用的时候,才会触发类的初始化,所以也是懒加载的一种形式

注意点 以上所有按照类来使用单例都可以通过反射的机制 实例化出类 还是不安全

再java1.5后出了enum枚举这个类 这个类是再反射期间不能够操作的 所以用enum相对来说比较安全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public enum SingletonEnum { 
/**
* 1.从Java1.5开始支持;
* 2.无偿提供序列化机制;
* 3.绝对防止多次实例化,即使在面对复杂的序列化或者反射攻击的时候;
*/

instance;

private String others;

SingletonEnum() {

}

public void method() {
System.out.println("SingletonEnum");
}

public String getOthers() {
return others;
}

public void setOthers(String others) {
this.others = others;
}
}
  • Title: java设计模式
  • Author: faith team
  • Created at: 2023-06-28 09:06:05
  • Updated at: 2025-11-29 09:01:08
  • Link: https://redefine.ohevan.com/2023/06/28/20230712java设计模式/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments