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号