2024年1月13日发(作者:)
java 单例模式写法
Java 单例模式写法
单例模式是一种常见的设计模式,用于保证一个类只有一个实例,并提供一个全局访问点来获取该实例。单例模式在各种应用场景中都有广泛的应用,比如线程池、数据库连接池、日志记录器等。
在这篇文章中,我们将深入学习如何在 Java 中实现单例模式,探讨不同的单例模式写法以及它们的优缺点。
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 volatile Singleton instance;
private Singleton() {} 私有的构造方法
public static Singleton getInstance() {
if (instance == null) {
synchronized () {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
在这个实现中,使用双重检查锁定(double-checked locking)来确保只有当 instance 为 null 时才进行实例化。由于使用了 synchronized
块,可以避免线程冲突问题。此外,在创建 instance 时使用了 volatile 关键字来确保可见性,以避免指令重排序引发的问题。
3. 静态内部类单例模式
通过使用静态内部类,我们可以在需要使用单例对象时才进行实例化。静态内部类仅在使用时被加载,而且只会被加载一次,保证了线程安全性。以下是一种实现方式:
java
public class Singleton {
private Singleton() {} 私有的构造方法
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return CE;
}
}
在这个实现中,外部类的私有构造方法保证了其他类无法直接实例化
Singleton 对象。同时,静态内部类 SingletonHolder 包含了一个静态常量 INSTANCE,对象的实例化是在静态内部类被加载时进行的,由于类的初始化在 Java 虚拟机中是线程安全的,所以这种实现方式也是线程安全的。
4. 枚举类单例模式
自 Java 5 起,枚举类被引入到 Java 语言中,枚举类的实例化是线程安
全的,并且只会实例化一次,因此可以作为单例模式的实现方式。以下是一种使用枚举类实现单例模式的写法:
java
public enum Singleton {
INSTANCE;
public void doSomething() {
单例对象的方法
}
}
在这个实现中,我们直接将枚举类 Singleton 定义为一个只有一个实例的枚举类。通过 CE,我们可以得到该单例对象的实例,并调用其方法。
总结:
单例模式是一种非常常见且实用的设计模式,用于限制一个类只能有一个实例。在 Java 中,我们可以通过不同的实现方式来满足不同需求,包括饿汉式、懒汉式、静态内部类、枚举类等。选择合适的实现方式需要考虑
其线程安全性、创建时机、资源消耗等因素。通过学习和了解不同的单例模式写法,我们可以更好地应用单例模式来解决实际问题。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1705128461a1394828.html
评论列表(0条)