Java单例模式手写实现:从入门到精通

在Java开发中,单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。单例模式在系统设计中有着广泛的应用,如数据库连接池、文件操作等。本文将从入门到精通,深入解析Java单例模式的手写实现。
一、单例模式概述
单例模式是一种创建型设计模式,它通过保证一个类仅有一个实例,并提供一个全局访问点,从而使得对实例的访问被严格控制在单一入口。单例模式的核心思想是控制实例的创建,防止外部通过反射、反序列化等方式创建多个实例。
二、单例模式实现方法
1. 懒汉式
懒汉式单例模式是指在类加载时不初始化实例,在首次使用时才创建实例。以下是一个懒汉式单例模式的实现示例:
```java
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
```
懒汉式单例模式的优点是实现简单,但存在线程安全问题。在多线程环境下,多个线程可能同时进入`if (instance == null)`判断,导致创建多个实例。
2. 饿汉式
饿汉式单例模式在类加载时就初始化实例,保证了线程安全,但可能会导致资源浪费。以下是一个饿汉式单例模式的实现示例:
```java
public class HungrySingleton {
private static final HungrySingleton instance = new HungrySingleton();
private HungrySingleton() {}
public static HungrySingleton getInstance() {
return instance;
}
}
```
饿汉式单例模式的优点是线程安全,但缺点是类加载时就初始化实例,可能会浪费资源。
3. 双重校验锁
双重校验锁(Double-Checked Locking)单例模式是一种兼顾懒汉式和饿汉式优缺点的实现方式。以下是一个双重校验锁单例模式的实现示例:
```java
public class DoubleCheckedLockingSingleton {
private static volatile DoubleCheckedLockingSingleton instance;
private DoubleCheckedLockingSingleton() {}
public static DoubleCheckedLockingSingleton getInstance() {
if (instance == null) {
synchronized (DoubleCheckedLockingSingleton.class) {
if (instance == null) {
instance = new DoubleCheckedLockingSingleton();
}
}
}
return instance;
}
}
```
双重校验锁单例模式的优点是线程安全,且只有在首次使用时才创建实例,节省资源。
4. 静态内部类
静态内部类单例模式利用静态内部类和Java类加载机制保证线程安全。以下是一个静态内部类单例模式的实现示例:
```java
public class StaticInnerClassSingleton {
private static class SingletonHolder {
private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
}
private StaticInnerClassSingleton() {}
public static StaticInnerClassSingleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
```
静态内部类单例模式的优点是线程安全,且实现简单。
5. 枚举
枚举单例模式是Java 5及以上版本提供的一种简单、安全、线程安全的单例模式实现方式。以下是一个枚举单例模式的实现示例:
```java
public enum EnumSingleton {
INSTANCE;
public void doSomething() {
// 业务逻辑
}
}
```
枚举单例模式的优点是简单、安全、线程安全,且易于理解。
三、总结
本文深入分析了Java单例模式的手写实现,从懒汉式、饿汉式、双重校验锁、静态内部类到枚举单例模式,每种实现方式都有其优缺点。在实际开发中,应根据具体需求选择合适的单例模式实现方式。






