Java 单例模式

Java 单例模式示例

 

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
package com.joyupx.cms.example.single;
 
/**
 * 多线程环境中保证单例的写法。
 * @author hapday
 */
public class SingleInstanceExample {
 
    private static SingleInstanceExample singleInstanceExample;
 
    private SingleInstanceExample() {}
 
    public static SingleInstanceExample getInstance() {
        // 防止重复创建对象,保证只创建一次。
        if (null == singleInstanceExample) {
            synchronized (SingleInstanceExample.class) {
                // 防止多线程并发时其它线程再创建对象导致的重复,进一步保证只创建一次。
                if (null != singleInstanceExample) {
                    singleInstanceExample = new SingleInstanceExample();
                }
            }
        }
 
        return singleInstanceExample;
    }
 
}

  

多线程环境下的单例模式

 

 

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
28
29
30
31
package com.joyupx.cms.example.thread.volatileVariable;
 
/**
 * 双重检查锁定(Double-Checked Locking)与 volatile。
 * 在单例模式的实现中,双重检查锁定是一种常见的做法,而 volatile 关键字在这里用于确保实例变量的可见性。
 * 在这个示例中,instance 变量被声明为 volatile,以确保在多线程环境中,当一个线程创建了 Singleton 实例后,其他线程能够立即看到这个变化。
 * 这是因为在没有 volatile 修饰的情况下,编译器可能会对 instance 变量的读取进行优化(如将其缓存在线程本地),从而导致其他线程看不到最新的值。
 */
public class Singleton {
    // volatile 确保 instance 的可见性
    private static volatile Singleton instance = null;
 
    // 私有构造函数防止实例化
    private Singleton() {}
 
    // 公共静态方法用于获取实例
    public static Singleton getInstance() {
        // 防止重复创建对象,保证只创建一次。
        if (instance == null) { // 第一次检查,无需同步
            synchronized (Singleton.class) {
                // 防止多线程并发时其它线程再创建对象导致的重复,进一步保证只创建一次。
                if (instance == null) { // 第二次检查,需要同步
                    instance = new Singleton();
                }
            }
        }
 
        return instance;
    }
     
}

 

  

 

posted @   hapday  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示