Java 单例模式

Java 单例模式示例

 

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;
    }

}

  

多线程环境下的单例模式

 

 

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 @ 2024-11-09 19:37  hapday  阅读(22)  评论(0)    收藏  举报