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;
    }
    
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号