java 单例的实例的几种方式

Java中的单例模式是一种设计模式,它确保一个类在全局范围内只有一个实例,并提供一个全局访问点来获取这个唯一的实例。下面是一些实现单例模式的常见方法:

1. 饿汉式(静态常量)

 

Java

1public class Singleton {
2    // 创建 Singleton 类的一个对象
3    private static final Singleton INSTANCE = new Singleton();
4
5    // 让构造函数为 private,这样该类就不会被实例化
6    private Singleton() {}
7
8    // 获取唯一可用的对象
9    public static Singleton getInstance() {
10        return INSTANCE;
11    }
12}

这种方式是在类加载时就完成了初始化,所以是线程安全的。

2. 饿汉式(静态代码块)

与上面类似,只是将实例化部分放在静态代码块中,确保在类加载时初始化。

Java   

1public class Singleton {
2    private static Singleton instance;
3    static {
4        instance = new Singleton();
5    }
6
7    private Singleton() {}
8
9    public static Singleton getInstance() {
10        return instance;
11    }
12}

3. 懒汉式(线程不安全)
Java
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton(); // 线程不安全
        }
        return instance;
    }
}
这种实现方式在多线程环境下可能会创建多个实例,因为它没有进行同步处理。

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

 

Java

1public class Singleton {
2    private volatile static Singleton singleton;
3    private Singleton() {}
4
5    public static Singleton getSingleton() {
6        if (singleton == null) { 
7            synchronized (Singleton.class) {
8                if (singleton == null) {
9                    singleton = new Singleton();
10                }
11            }
12        }
13        return singleton;
14    }
15}

双重检查锁定通过两次检查 singleton 是否为null,只有当第一次检查发现为null并进入同步代码块时,才会进行实例化操作,从而避免了多线程环境下的重复初始化问题。

5. 静态内部类

 

Java

1public class Singleton {
2    private Singleton() {}
3
4    private static class SingletonHolder {
5        private static final Singleton INSTANCE = new Singleton();
6    }
7
8    public static Singleton getInstance() {
9        return SingletonHolder.INSTANCE;
10    }
11}

静态内部类的方式利用了类加载机制保证了线程安全性,且延迟了初始化,既实现了懒加载又保证了线程安全。

以上就是在Java中实现单例模式的一些经典方法,每种方法都有其适用场景和优缺点,在实际应用中需根据需求选择合适的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值