首页 > 编程语言 >Java设计模式之单例模式学习

Java设计模式之单例模式学习

时间:2024-10-19 14:32:11浏览次数:8  
标签:Singleton Java instance 线程 单例 static 设计模式 public

单例模式


目录

Java中的单例模式(Singleton Pattern)是一种常用的设计模式,其目的是确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例。单例模式在多种情况下都很有用,比如配置文件读取、数据库连接池管理等。

在Java中实现单例模式有几种不同的方式,但最常见的有两种:懒汉式和饿汉式。此外,还有一些变种,如双重检查锁定(Double-Checked Locking)、静态内部类、枚举等。

1. 饿汉式(线程安全)

饿汉式单例模式在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。由于它在类加载时就完成了初始化,所以它是线程安全的。

public class Singleton {
    // 直接初始化一个实例,私有防止外部直接访问
    private static final Singleton INSTANCE = new Singleton();

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

    // 提供一个全局的静态方法,返回唯一实例
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

2. 懒汉式(线程不安全)

懒汉式单例模式在类内部声明实例,但不立即初始化。第一次调用getInstance()方法时才进行实例化。不过,这种基本的实现方式在多线程环境下是不安全的。

public class Singleton {
    // 注意这里不是final
    private static Singleton instance;

    private Singleton() {}

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

3. 懒汉式(线程安全)

为了保证懒汉式单例在多线程环境下的安全性,可以对getInstance()方法加锁。但这种方式会降低效率,因为每次调用getInstance()都会进行线程锁定判断。

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

4. 双重检查锁定(Double-Checked Locking)

双重检查锁定是一种优化措施,既保证了线程安全,又避免了每次调用getInstance()都进行同步。但需要注意的是,这种实现方式在Java 1.4及以前版本中可能有问题,因为JVM对volatile关键字的实现可能不够充分。从Java 5开始,volatile关键字的语义得到了增强,从而可以安全地使用双重检查锁定。

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;
    }
}

5. 静态内部类

静态内部类方式利用了classloder的机制来保证初始化实例时只有一个线程,既实现了懒加载,又保证了线程安全。

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

    // 私有静态内部类
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

6. 枚举

枚举方式是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化,即使在面对复杂的序列化或者反射攻击的时候。

public enum Singleton {
    INSTANCE;

    // 可以添加其他方法
    public void whateverMethod() {
    }
}

在实际应用中,可以根据具体需求和场景选择适合的实现方式。

标签:Singleton,Java,instance,线程,单例,static,设计模式,public
From: https://www.cnblogs.com/BingBing-8888/p/18475862

相关文章