Java 单例模式

  

 

饿汉式:

  1. 构造器私有化 => 防止直接new
  2. 类内部创建对象赋予static变量
  3. 向外暴露static公共方法,返回类实例变量

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com;
 
public class Singleton {
  private String name;
  public static int n = 22;
  private static Singleton singleton = new Singleton("singleton");
 
  private Singleton(String name) {
    System.out.println("constructor was called");
    this.name = name;
  }
 
  public static Singleton getInstance() {
    return singleton;
  }
 
  @Override
  public String toString() {
    return "Singleton{" +
        "name='" + name + '\'' +
        '}';
  }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com;
 
import org.jetbrains.annotations.NotNull;
 
 
public class Test {
  public static void main(String @NotNull [] args) {
    Singleton s1 = Singleton.getInstance();
    Singleton s2 = Singleton.getInstance();
    System.out.println(s1==s2);
    System.out.println(s1);
    System.out.println(s2);
  }
}

  

 

懒汉式

  1. 构造器私有化
  2. 定义static类属性保存实例
  3. 提供public static方法返回static类属性保存的实例
  4. 只有当用户使用getInstance时,才返回构造实例,再次调用,返回之前创建的实例

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
package com;
 
public class Singleton {
  private String name;
  public static int n = 33;
  private static Singleton singleton;  // default null
 
  private Singleton(String name) {
    System.out.println("constructor was called");
    this.name = name;
  }
 
  @Override
  public String toString() {
    return "Singleton{" +
        "name='" + name + '\'' +
        '}';
  }
 
  public static Singleton getInstance(String name) {
    if (singleton == null) {
      singleton = new Singleton(name);
    }
    return singleton;
  }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com;
 
import org.jetbrains.annotations.NotNull;
 
 
public class Test {
  public static void main(String @NotNull [] args) {
    System.out.println(Singleton.n);
//    Singleton s1 = Singleton.getInstance("s1");
//    Singleton s2 = Singleton.getInstance("s2");
//    System.out.println(s1==s2);
//    System.out.println(s1);
//    System.out.println(s2);
  }
}

 

 

二者区别:
1: 创建时机不同,饿汉式类加载时就创建了对象实例,懒汉式getInstance时才创建
2: 饿汉式不存在线程安全问题,懒汉式存在线程安全问题
3: 饿汉式存在浪费资源的可能,懒汉式使用时才创建
4: javaSE标准类中,java.lang.Runtime就是单例模式

 

posted @   ascertain  阅读(234)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示