单例模式
-
饿汉式单例模式在类加载时就进行实例化,保证了线程安全性。饿汉式单例模式的优点是线程安全,但是可能存在资源浪费的问题,因为该实例即使在系统启动时就被创建出来,但可能在系统运行过程中一直没有被使用到。
-
懒汉式单例模式的优点是延迟加载,减小了内存消耗,但是可能存在线程安全问题,需要进行线程同步。为了保证线程安全,可以在getInstance()方法中添加synchronized关键字,以保证同一时刻只有一个线程能够进入临界区进行实例的创建和初始化。
综合来说,饿汉式单例模式适合单例对象创建比较简单且不需要耗费过多系统资源的情况,而懒汉式单例模式适合单例对象创建比较复杂或者需要耗费较长时间的情况。同时,在考虑线程安全的前提下,可以根据实际情况选择合适的实现方式。
饿汉式
在声明实例时就初始化
public class Singleton {
// 1. 将构造方法私有化,防止外部通过new创建实例
private Singleton() {
}
// 2. 定义一个静态变量来保存实例,并且进行初始化
private static Singleton instance = new Singleton();
// 3. 提供一个公有的静态方法来获取实例
public static Singleton getInstance() {
return instance;
}
}
懒汉式
在获取实例时初始化
public class Singleton {
// 1. 将构造方法私有化,防止外部通过new创建实例
private Singleton() {
}
// 2. 声明一个静态的私有成员变量,但不进行初始化
private static Singleton instance;
// 3. 提供一个公有的静态方法来获取实例,添加synchronized关键字保证线程安全
public static synchronized Singleton getInstance() {
// 如果实例还未创建,则进行初始化
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}