单例模式的8种写法
单例模式是一种常用的设计模式,在软件开发中经常被使用。它的主要目的是确保一个类只有一个实例,并且提供一个全局访问点。
在实际应用中,单例模式的使用非常广泛。比如,在某个系统中,只允许创建一个日志文件、数据库连接池等。这些场景下,单例模式可以确保只有一个实例存在,避免资源的浪费和冲突。
单例模式的实现方式有多种,下面将详细介绍8种常见的实现方法。
1. 饿汉式(直接初始化):
java
public class Singleton {
单例模式的几种实现方式 private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
这种方式在类加载时就创建了一个实例,因此线程安全,但可能存在资源浪费的问题,因为即使不使用也会创建实例。
2. 饿汉式(静态代码块初始化):
java
public class Singleton {
private static final Singleton INSTANCE;
static {
INSTANCE = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
与第一种方式相似,只是将实例创建的过程放在了静态代码块中。
3. 懒汉式(线程不安全):
java
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
这种方式实现了懒加载,只有在第一次调用getInstance方法时才会创建实例。但是这种方式在多线程环境下是不安全的,可能会创建多个实例。
4. 懒汉式(线程安全,加锁):
java
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
为了避免在多线程环境下创建多个实例,可以使用synchronized关键字加锁,确保只有一个线程可以创建实例。但是这种方式效率较低,每次调用getInstance方法都需要进行同步,即使实例已经创建了。
5. 懒汉式(线程安全,双重检查):
java
public class Singleton {
private static volatile Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
synchronized (Singleton.class) {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论