设计模式:单例模式

回答

“单例模式是一种创建型设计模式,目的是确保一个类只有一个实例,并提供全局访问点来访问这个实例。它非常适合需要唯一对象的场景,如日志记录器、配置管理器等。

在Java中,可以通过饿汉式、懒汉式、双重检查锁、静态内部类等方式实现单例模式。其中,饿汉式和静态内部类的实现方式天然是线程安全的,因为实例在类加载时就被创建。懒汉式的实现方式需要使用synchronized关键字来确保线程安全,但可能会影响性能。而双重检查锁则在保证线程安全的同时提高了性能。

设计模式:单例模式

1. 什么是单例模式?

单例模式(Singleton Pattern)是一种创建型设计模式,它的目的是确保一个类只有一个实例,并且提供全局访问点来访问该实例。这个模式非常适合需要唯一对象的场景,如数据库连接池、日志对象、配置管理器等。

2.如何使用单例模式?

在Java中,有多种方式可以实现单例模式。以下是常见的几种实现方式:

(1) 饿汉式(Eager Initialization)

1
2
3
4
5
6
7
8
9
10
11
12
public class Singleton {
// 私有静态实例,类加载时初始化
private static final Singleton instance = new Singleton();

// 私有构造函数,防止外部创建实例
private Singleton() {}

// 公有静态方法,提供实例的全局访问点
public static Singleton getInstance() {
return instance;
}
}

(2) 懒汉式(Lazy Initialization)

这里需要注意如果不加上synchronized的话饿汉式创建的单例是线程不安全的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Singleton {
// 私有静态实例,延迟加载
private static Singleton instance;

// 私有构造函数
private Singleton() {}

// 公有静态方法,同步以保证线程安全
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

(3) 双重检查锁(Double-Checked Locking)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Singleton {
// 使用volatile关键字,确保可见性和有序性
private static volatile Singleton instance;

private Singleton() {}

public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}

(4) 枚举类(enum)

这是实现单例模式的推荐方式之一,特别是在涉及到防止序列化和反射攻击时。

1
2
3
4
5
6
7
8
public enum Singleton {
INSTANCE;

// 其他方法可以在这里定义
public void doSomething() {
System.out.println("Singleton instance is doing something.");
}
}

3. 单例模式的线程安全性

单例模式在多线程环境中可能面临竞争条件(race condition)问题,特别是在“懒汉式”实现中。为了解决这个问题,可以采用以下方式:

  • 饿汉式:线程安全,因为实例在类加载时就已经创建。
  • 懒汉式(加同步锁):通过synchronized关键字保证线程安全,但可能会影响性能。
  • 双重检查锁:在保证线程安全的同时提高了性能。
  • 静态内部类:线程安全,并且具有良好的性能,因为类加载机制保证了实例的唯一性和线程安全性。

4.单例模式使用的举例

  1. 网站的计数器,一般也是采用单例模式实现,否则难以同步。

  2. 应用程序的日志应用,一般都是单例模式实现,只有一个实例去操作才好,否则内容不好追加显 示。

  3. 多线程的线程池的设计一般也是采用单例模式,因为线程池要方便对池中的线程进行控制

  4. Windows的(任务管理器)就是很典型的单例模式,他不能打开俩个

  5. windows的(回收站)也是典型的单例应用。在整个系统运行过程中,回收站只维护一个实例。