Java 单例模式详解
引言
在软件设计中,单例模式(Singleton Pattern)是一种常用的设计模式,它确保一个类只有一个实例,并提供全局访问点。本文将介绍四种常见的单例模式实现方式,包括懒汉式(线程不安全)、饿汉式、懒汉式(简单同步方法)和双重检查锁定(Double-Checked Locking)。
懒汉式(线程不安全)
懒汉式单例模式在第一次调用 getInstance 方法时实例化对象。这种实现方式在单线程环境下没有问题,但在多线程环境中存在线程安全问题,可能会导致多个实例的创建。
package com.zsn.singleDemo;
/**
* @Author: zsn
* @Date: 2024/7/5 10:54
* @Description: 懒汉式(线程不安全)
* @Version: 1.0
*/
public class SingleDemo1 {
private static SingleDemo1 singleDemo1;
private SingleDemo1() {
}
public static SingleDemo1 getInstance() {
if (singleDemo1 == null) {
singleDemo1 = new SingleDemo1();
}
return singleDemo1;
}
}
饿汉式
饿汉式单例模式在类加载时就创建实例,线程安全,但如果实例初始化开销大且在实际使用中可能不会被用到,会导致资源浪费。
package com.zsn.singleDemo;
/**
* @Author: zsn
* @Date: 2024/7/5 10:56
* @Description: 饿汉式
* @Version: 1.0
*/
public class SingleDemo2 {
private static SingleDemo2 singleDemo2 = new SingleDemo2();
private SingleDemo2() {
}
public static SingleDemo2 getSingleDemo2() {
return singleDemo2;
}
}
懒汉式(加一个锁 - 简单同步方法)
通过在 getInstance 方法上添加 synchronized 关键字,确保线程安全,但每次调用 getInstance 方法时都会进行同步,影响性能。
package com.zsn.singleDemo;
/**
* @Author: zsn
* @Date: 2024/7/5 11:09
* @Description: 懒汉式(加一个锁 - 简单同步方法)
* @Version: 1.0
*/
public class SingletonLazySimpleSync {
private static SingletonLazySimpleSync instance;
private SingletonLazySimpleSync() {
}
public static synchronized SingletonLazySimpleSync getInstance() {
if (instance == null) {
instance = new SingletonLazySimpleSync();
}
return instance;
}
}
双重检查锁定(Double-Checked Locking)
双重检查锁定在保持延迟初始化的同时确保线程安全,并且在实例已经初始化的情况下避免了同步开销,是一种优化的单例实现方式。
package com.zsn.singleDemo;
/**
* @Author: zsn
* @Date: 2024/7/5 11:14
* @Description: 双重检查锁定
* @Version: 1.0
*/
public class SingletonLazyDoubleCheck {
private static volatile SingletonLazyDoubleCheck singletonLazyDoubleCheck;
private SingletonLazyDoubleCheck() {
}
public static SingletonLazyDoubleCheck getInstance() {
if (singletonLazyDoubleCheck == null) {
synchronized (SingletonLazyDoubleCheck.class) {
if (singletonLazyDoubleCheck == null) {
singletonLazyDoubleCheck = new SingletonLazyDoubleCheck();
}
}
}
return singletonLazyDoubleCheck;
}
}
总结
单例模式是一种简单而强大的设计模式,适用于需要全局唯一实例的场景。不同的实现方式各有优劣,需要根据实际需求进行选择:
- 懒汉式(线程不安全) :适用于单线程环境。
- 饿汉式:适用于需要快速响应且资源消耗不高的实例。
- 懒汉式(加一个锁 - 简单同步方法) :适用于多线程环境,但性能开销较大。
- 双重检查锁定:兼顾延迟初始化和性能,是多线程环境下的推荐实现方式。
选择适合的单例模式实现方式,能够在保证程序正确性的同时提高性能。希望本文能够帮助您更好地理解和应用单例模式。