单例模式详解(DLC和spring源码中的应用)
单例模式通过确保一个类只有一个实例并提供一个全局访问点来访问该实例来实现。
通常,实现单例模式有两种方法:饿汉式和懒汉式。
饿汉式单例在类加载时就创建了实例,所以不存在线程安全问题。懒汉式单例在第一次调用时才创建实例,并且必须通过同步机制来保证线程安全。
下面是一个简单的饿汉式单例类的示例:
public class Singleton {
// 创建 Singleton 的一个对象
private static Singleton instance = new Singleton();
// 让构造函数为 private,这样该类就不会被实例化
private Singleton() {
}
// 获取唯一可用的对象
public static Singleton getInstance() {
return instance;
}
// 显示消息
public void showMessage() {
System.out.println("Hello World!");
}
}
下面是一个简单的懒汉式单例类的示例:
public class Singleton {
// 创建 Singleton 的一个对象
private static Singleton instance;
// 让构造函数为 private,这样该类就不会被实例化
private Singleton() {
}
// 获取唯一可用的对象
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
// 显示消息
public void showMessage() {
System.out.println("Hello World!");
}
}
改进之线程安全-DLC
存在这样一种情况,当懒汉模式中进程A运行到if(instance==