Blog-02-设计模式探索-单例模式

单例模式的适用场景
在整个程序运行时仅需要一个对象,而且不可以创建多个对象,这样的使用场景就可以选择使用单例模式。常见的单例模式有以下几种:
1、懒汉模式
2、饿汉模式
3、枚举单例
4、静态内部类
5、双重锁定
以下将逐一介绍具体的使用方法,需要注意的是没有完美的单例模式,只有最合适你项目使用的单例模式,在不同的使用场景,要好好考虑,使用哪种单例模式最适合。

一、饿汉模式
饿汉模式由于在生成Singleton Class时就创建了静态的对象提供外部使用,而且使用了final关键字做声明,所以本身就是线程安全的。

public class Singleton {    
    private static final Singleton instance = new Singleton();    

    private Singleton(){

    }    

    public static Singleton getInstance() {        
        return instance;
    }
}

二、懒汉模式
懒汉模式是声明一个静态对象,使用private权限的构造方法和getInstance()方法给外部提供可访问的入口。
实例中在单例模式中添加了getInfo()方法,用于说明供外部调用的例子。以下会举例线程安全和非线程安全的实现方式,在实际开发过程中,可以选择符合你自己项目要求的懒汉模式。
1、1 非线程安全
实现非线程安全的懒汉模式过程:

public class Singleton {    
    private static Singleton instance;    

    private Singleton(){

    }    

    public static Singleton getInstance() {        
        if (instance == null) {
            instance = new Singleton();
        }        
        return instance;
    }   

    public void getInfo() {
        Log.i("Singleton", "Hello Singleton");
    }

}

调用方式:

Singleton.getInstance().getInfo();

打印:

Singleton: Hello Singleton

1、2 线程安全
实现线程安全的懒汉模式,仅需要在getInstance()方法中增加synchronized关键字即可。在此线程模式中需要关注的是,资源消耗的问题,因为每次在调用getInstance()方法是都会进行一次同步操作,运行效率就会相对较低。
实现线程安全的懒汉模式过程:

public class Singleton {    
    private static Singleton instance;    

    private Singleton(){

    }    

    public static synchronized Singleton getInstance() {        
        if (instance == null) {
            instance = new Singleton();
        }        
        return instance;
    }    

    public void getInfo() {
        Log.i("Singleton", "Hello Singleton");
    }

}

三、枚举单例
枚举在单例实现中是代码最简单的,由于枚举实例在Java中默认就是线程安全的,而且保证仅有一个实例,因为可以自由序列化。
实现过程:

enum  Singleton {
   INSTANCE;   
    public void getInfo(){
       Log.i("Singleton", "Hello Singleton");
   }
}

调用方式:

Singleton.INSTANCE.getInfo();

四、静态内部类
静态内部类的实现方式与懒汉模式相似,都是当首次加载Singleton时,不会进行初始化,而是在调用getInstance()方法后,再进行初始化,属于线程安全的。

实现过程:

public class Singleton {    
    private Singleton(){

    }    

    public static class SingletonHolder{        
        private static final Singleton singleton = new Singleton();
    }    

    public static Singleton getInstance(){        
        return SingletonHolder.singleton;
    }    

    public void getInfo() {
        Log.i("Singleton", "Hello Singleton");
    }
}

调用方式:

Singleton.getInstance().getInfo();

五、双重检查锁定
双重检查指的是在getInstance()方法中,进行了两次对intance对象判空的过程。结合volatile声明instance对象,来保证线程安全。
实现过程:

public class Singleton {    
    private volatile static Singleton instance = null;    

    private Singleton(){

    }    

    public static Singleton getInstance() {        
        if (instance != null) {            
            synchronized (Singleton.class) {                
                if (instance != null) {
                    instance = new Singleton();
                }
            }
        }        
        return instance;
    }    

    public void getInfo() {
        Log.i("Singleton", "Hello Singleton");
    }
}

调用方式:

Singleton.getInstance().getInfo();

欢迎关注我的公众号,分享更多的原创文章,关于技术、关于感悟。
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值