Java技术教程
引言
在Java编程中,单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。本教程将详细介绍如何在Java中实现单例模式,并包含一个详细的代码案例。
单例模式简介
单例模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点来访问该实例。它通常用于以下情况:
- 控制资源的访问,如数据库连接池。
- 在整个应用程序中共享一个实例,例如日志系统。
实现单例模式
在Java中实现单例模式有多种方法,其中最常见的是“饿汉式”和“懒汉式”。本教程将演示“饿汉式”和一种线程安全的“懒汉式”实现。
饿汉式
饿汉式在类加载时就创建实例,因此是线程安全的。
public class SingletonEager {
// 静态实例在类加载时被初始化
private static final SingletonEager INSTANCE = new SingletonEager();
// 私有构造函数,防止外部实例化
private SingletonEager() {}
// 提供全局访问点
public static SingletonEager getInstance() {
return INSTANCE;
}
}
线程安全的懒汉式
懒汉式在第一次调用getInstance()时才创建实例。为了确保线程安全,我们可以使用synchronized关键字。
public class SingletonLazy {
// 静态实例,初始为null
private static volatile SingletonLazy INSTANCE;
// 私有构造函数,防止外部实例化
private SingletonLazy() {}
// 提供全局访问点,使用synchronized确保线程安全
public static synchronized SingletonLazy getInstance() {
if (INSTANCE == null) {
INSTANCE = new SingletonLazy();
}
return INSTANCE;
}
}
注意:在Java 5及以上版本中,可以使用双重检查锁定(Double-Checked Locking)来优化线程安全的懒汉式实现,以减少同步的开销。
双重检查锁定
public class SingletonDoubleChecked {
// 使用volatile确保多线程正确处理INSTANCE变量
private static volatile SingletonDoubleChecked INSTANCE;
// 私有构造函数,防止外部实例化
private SingletonDoubleChecked() {}
// 提供全局访问点,使用双重检查锁定
public static SingletonDoubleChecked getInstance() {
if (INSTANCE == null) { // 第1次检查
synchronized (SingletonDoubleChecked.class) {
if (INSTANCE == null) { // 第2次检查
INSTANCE = new SingletonDoubleChecked();
}
}
}
return INSTANCE;
}
}
结论
单例模式是Java编程中常用的设计模式之一,用于确保一个类只有一个实例,并提供一个全局访问点。本教程介绍了单例模式的简介,并演示了“饿汉式”、“线程安全的懒汉式”以及“双重检查锁定”的实现方式。