单例设计模式

一:简介

  1. 单例模式是最常用到的设计模式之一,分为饿汉式 和 懒汉式 这两种实现方式。
    一个类在整个系统中只有一个实例,而且这个实例在类的内部由private构造的,外部不能直接调用其构造方法,只能获取它的实例.
  2. 单例模式的优点:
    在内存中只有一个实例对象,节省内存空间.避免重复的创建和销毁对象,可以提高性能,避免对多重资源的重复占用,可以全局进行访问.

二:饿汉式单例

  1. 方式1:

    public class EHanSingleCase {
        private static EHanSingleCase eHanSingleCase = new EHanSingleCase();
    
        private EHanSingleCase(){};
    
        public static EHanSingleCase getInstance(){
            return eHanSingleCase;
        }
    }
    

    优点:实现简单,不存在多线程问题,直接声明一个私有对象,然后对外提供一个获取对象的方法。

    缺点:class 类在被加载的时候创建EHanSingleCase实例,如果对象创建后一直没有使用,则会浪费很大的内存空间,此方法不适合创建大对象。

三:懒汉式单例

  1. 方式一(线程不安全):

    public class LHanSingleCase {
        private static LHanSingleCase lHanSingleCase = null;
    
        private LHanSingleCase(){};
    
        public static LHanSingleCase getInstance(){
            if(lHanSingleCase == null){
                lHanSingleCase = new LHanSingleCase();
            }
            return lHanSingleCase;
        }
    }
    

    优点:节省内存空间,在使用的时候才会创建;

    缺点:在多线程下,可能会创建多个实例(一定要重视这个问题,有时候如果在单例对象的构造方法中做了某些重要操作,创建多个实例可能会造成可怕后果,如:打开Android的Sqlite数据库连接)。

  2. 方式二(线程安全):

    public class LHanSingleCase {
        private static LHanSingleCase lHanSingleCase = null;
    
        private LHanSingleCase(){};
    
        public static synchronized LHanSingleCase getInstance(){
            if(lHanSingleCase == null){
                lHanSingleCase = new LHanSingleCase();
            }
            return lHanSingleCase;
        }
    }
    

    优点:支持多线程,且以懒汉式的方式加载,不浪费内存空间。

    缺点:将 synchronized 块加在方法上,会影响并发量,每次调用getInstance()方法都会线程同步,效率十分低下。最重要的是,当创建好实例对象之后,就不必继续进行同步了。

  3. 方式三(线程安全,推荐):

    public class LHanSingleCase {
        private static LHanSingleCase lHanSingleCase = null;
    
        private LHanSingleCase(){};
    
        public static LHanSingleCase getInstance(){
            if(lHanSingleCase == null){
                synchronized (LHanSingleCase.class){
                    if(lHanSingleCase == null){
                        lHanSingleCase = new LHanSingleCase();
                    }
                }
            }
            return lHanSingleCase;
        }
    }
    

    优点:支持多线程,并发量高,且以懒汉式加载,不浪费内存空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值