java设计模式:单例模式

本文详细介绍了单例模式的两种实现方式——懒汉模式和饿汉模式,并对比了它们在资源加载和性能上的区别。此外,还探讨了如何解决懒汉模式下的线程安全问题,包括同步方法、双重检查锁定及静态内部类三种解决方案。

单例模式:运行期间有且仅有一个实例

1.一个类只有一个实例

2.必须自行创建这个实例

3.必须自行向整个系统提供这个实例

 

懒汉模式:

     在类加载时不创建实例,运行调用时创建。类加载快,在运行时获取对象慢。

复制代码
//懒汉模式
public class Pet {
    
    private Pet(){
        
    }
    
    private static Pet pet=null;
    
    public static Pet getInfo(){
        if(pet==null){
            pet=new Pet();
        }
        return pet;
    }

}
复制代码

饿汉模式:

     在类加载时创建实例。类加载慢,在运行时获取对象快。

复制代码
//饿汉模式
public class Pet {
    
    private Pet(){
        
    }
    
    private static Pet pet=new Pet();
    
    public static Pet getInfo(){
        return pet;
    }

}
复制代码

饿汉模式线程安全,但是,懒汉模式线程安全性不高,若是多线程,又怎能保证单例?

第一种方法:同步

      在方法调用上加了同步,虽然线程安全了,但是每次都要同步,会影响性能,毕竟99%的情况下是不需要同步的

 public static synchronized Pet getInfo(){
        if(pet==null){
            pet=new Pet();
        }
        return pet;
    }

第二种方法:双重检查锁定

      在getInfo中做了两次null检查,确保了只有第一次调用单例的时候才会做同步,这样也是线程安全的,同时避免了每次都同步的性能损耗

复制代码
 public static Pet getInfo(){
        if(pet==null){
            synchronized(Pet.class){
                 if(pet==null){
                     pet=new Pet();
                  }
             }
        }
        return pet;
    }
复制代码

第三种方法:静态内部类

       利用了classloader的机制来保证初始化时只有一个线程,所以也是线程安全的,同时没有性能损耗

复制代码
public class Pet {    
    private static class LazyHolder {    
       private static final Pet INSTANCE = new Pet();    
    }    
    private Pet (){}    
    public static final Singleton getInfo() {    
       return LazyHolder.INSTANCE;    
    }    
}    
复制代码

资源加载和性能:

      饿汉模式在类创建的同时就实例化一个静态对象,不管之后会不会使用这个单例,都会占用一定的内存,但是相应的,在第一次调用时速度也会非常快,因为其资源已经初始化完成。

      懒汉模式会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉模式一样可。

转载于:https://www.cnblogs.com/WuXuanKun/p/5542370.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值