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 (Singleton.class) {
                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 SingletonHolder.INSTANCE;
    }
}
在这个实现中,外部类的私有构造方法保证了其他类无法直接实例化 Singleton 对象。同时,静态内部类 SingletonHolder 包含了一个静态常量 INSTANCE,对象的实例化是在静态内部类被加载时进行的,由于类的初始化在 Java 虚拟机中是线程安全的,所以这种实现方式也是线程安全的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。