java中如何创建一个单例模式

java中如何创建一个单例模式

在Java中创建一个单例模式可以通过以下五种方法:1、懒汉式(线程不安全) 2、懒汉式(线程安全) 3、饿汉式 4、双重检查 5、静态内部类。在这里,我们将主要讨论静态内部类的方法,因为它结合了懒汉式和饿汉式的优点,既实现了延迟加载,也实现了线程安全。

一、静态内部类

静态内部类的方法是最推荐的单例模式实现方法,它不仅保证了线程安全,也保证了单例的唯一性,同时也延迟了单例的实例化。

1.1 原理介绍

静态内部类的方式在 Singleton 类被装载时并不会立即实例化,而是在需要实例化时,调用 getInstance 方法,才会装载 SingletonInstance 类,从而完成 Singleton 的实例化。

类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM 帮我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。

1.2 代码实现

public class Singleton {

private Singleton() {}

private static class SingletonInstance {

private static final Singleton INSTANCE = new Singleton();

}

public static Singleton getInstance() {

return SingletonInstance.INSTANCE;

}

}

二、懒汉式(线程不安全)

懒汉式顾名思义就是实例在需要的时候才进行创建,具有延迟加载的好处,但是多线程环境下不能保证单例的唯一性。

2.1 代码实现

public class Singleton {

private static Singleton instance;

private Singleton (){}

public static Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

三、懒汉式(线程安全)

懒汉式在多线程环境下保证单例的唯一性,可以使用synchronized关键字。但是每次通过getInstance方法得到Singleton实例的时候都有一个线程安全的处理,这样会消耗更多的资源。

3.1 代码实现

public class Singleton {

private static Singleton instance;

private Singleton (){}

public static synchronized Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

四、饿汉式

饿汉式在类加载的时候就进行实例化,没有实现延迟加载,如果从始至终未使用这个实例,则会造成内存的浪费。

4.1 代码实现

public class Singleton {

private static Singleton instance = new Singleton();

private Singleton (){}

public static Singleton getInstance() {

return instance;

}

}

五、双重检查

双重检查方式是方法级别的懒加载和线程安全的单例模式。通过在getInstance()方法中对singleton进行两次判断,确保了线程安全。

5.1 代码实现

public class Singleton {

private volatile static Singleton singleton;

private Singleton (){}

public static Singleton getSingleton() {

if (singleton == null) {

synchronized (Singleton.class) {

if (singleton == null) {

singleton = new Singleton();

}

}

}

return singleton;

}

}

以上就是在Java中创建单例模式的五种方法,建议在实际开发中使用静态内部类的方法实现单例模式,既保证了线程安全,又能做到延迟加载。

相关问答FAQs:

Q: 如何在Java中创建一个单例模式?
A: 单例模式是一种设计模式,用于确保类的实例只有一个。在Java中,可以通过以下方法创建一个单例模式:

  1. 通过私有构造函数创建类的实例: 首先,将类的构造函数声明为私有,以防止其他类直接实例化该类。

  2. 创建一个私有静态变量来存储类的实例: 在类的内部,创建一个私有静态变量,用于存储类的唯一实例。

  3. 创建一个公共静态方法来获取类的实例: 在类的内部,创建一个公共静态方法,用于获取类的实例。在这个方法内部,检查类的实例是否已经存在,如果存在则返回该实例,否则创建一个新实例并返回。

下面是一个示例代码:

public class Singleton {
    private static Singleton instance; // 私有静态变量,用于存储类的实例
    
    private Singleton() {} // 私有构造函数
    
    public static Singleton getInstance() { // 公共静态方法,用于获取类的实例
        if (instance == null) { // 检查实例是否已经存在
            instance = new Singleton(); // 创建新实例
        }
        return instance; // 返回实例
    }
}

可以通过调用Singleton.getInstance()方法来获取Singleton类的唯一实例。这种方式确保了在整个应用程序中只有一个Singleton实例存在。

原创文章,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/256665

(0)
Edit1Edit1
上一篇 2024年8月15日 上午1:21
下一篇 2024年8月15日 上午1:22
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部