单例模式的几种方式

本文深入探讨了单例模式的不同实现方式,包括饿汉式、懒汉式及双重检查锁定等,对比了它们在线程安全性、延迟加载和支持效率方面的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先是饿汉式:

public class Singleton {

private static Singleton s = new Singleton();

//屏蔽外部的new
private Singleton() {
super();
}
//提供一个全局的访问点
public static Singleton getInstance() {
return s;
}

public void A(){
System.out.println("xixi");
}

}

public class SingletonTest {

    public static void main(String[] args) {

// TODO Auto-generated method stub
/* Singleton s1 = Singleton.s;
Singleton s2 = Singleton.s;*/

Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();

System.out.println(s1 .equals(s2));   //true
s1.A();

}

对于懒汉式,在类加载的过程中就会去创建这个类的实例,并没有达到延迟加载的效果,但是线程是安全的!


然后是懒汉式:跟饿汉式的区别就是没有在一开始就初始化了,

//会在这个方法里面初始化

public synchronized static Singleton getInstance() {

                if(s==null) {

                s = new Singleton();

}

              return s;

}

注意:没有加锁的懒汉式是线程不安全的,但是如果加了锁之后,每个线程执行该方法的时候都会进行线程等待,就会导致同步情况下执行效率低!

所以只需要判断第一次是否为空的时候需要加锁,其余时候是不需要加锁的,为了解决这个问题,就有了双重验证式!

    

public  static Singleton getInstance() {

                if(s==null) {

                        synchronized(Singleton.class) {

                if(s== null) {

                s=new Singleton();

}

}

            s = new Singleton();

}

              return s;

}

注:双重验证式具有延迟加载,线程安全,同步情况效率高,唯一就是实现相对复杂!


对于类加载方式,具有以上所有的优点,并且实现简单

public class Singleton {
//屏蔽外部的new

private Singleton() {

}

    //静态内部类,用于创建唯一的Singleton的实例

private static class OnlyInstanceHolder{

        static private Singleton Only = new Singleton();

}

//公开的唯一访问点

public static Singleton getInstance() {

    return OnlyInstanceHolder.Only;

}

唯一的缺陷是不能防止反序列化!







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值