单例模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这种模式通常用于创建频繁使用的对象,以减少系统资源消耗和提高性能。
实现单例模式有多种方法,其中最常见的是饿汉式和懒汉式。下面分别介绍这两种实现方式:
饿汉式实现:
在类加载时,直接实例化对象并赋值给静态变量。这种方式称为饿汉式实现,因为它在类加载时就创建了实例,不需要等待外部调用。具体实现代码如下:
java复制代码
public class Singleton { | |
// 在类加载时就完成了初始化 | |
private static Singleton instance = new Singleton(); | |
private Singleton() {} | |
public static Singleton getInstance() { | |
return instance; | |
} | |
} |
懒汉式实现:
在类加载时不实例化对象,而是等到第一次调用?getInstance()
?方法时才实例化。这种方式称为懒汉式实现,因为它延迟了对象的创建时机。具体实现代码如下:
java复制代码
public class Singleton { | |
private static Singleton instance; | |
private Singleton() {} | |
public static synchronized Singleton getInstance() { | |
if (instance == null) { | |
instance = new Singleton(); | |
} | |
return instance; | |
} | |
} |
需要注意的是,懒汉式实现存在线程安全问题。在多线程环境下,如果没有进行同步控制,可能会出现多个实例的情况。为了解决这个问题,可以使用双重检查锁定(double-checked locking)机制,具体代码如下:
java复制代码
public class Singleton { | |
private volatile static Singleton instance; | |
private Singleton() {} | |
public static Singleton getInstance() { | |
if (instance == null) { | |
synchronized (Singleton.class) { | |
if (instance == null) { | |
instance = new Singleton(); | |
} | |
} | |
} | |
return instance; | |
} | |
} |
这种实现方式在第一次调用?getInstance()
?方法时才进行同步控制,避免了不必要的同步开销。同时,只有在实例为空时才进行同步控制,避免了多线程环境下创建多个实例的情况。