单例模式

为什么有单例模式

有个很经典的例子,就是一山不容二虎,就像中国古代只能允许一个中央集权的皇帝来发号施令。

java定义

一个类有且仅有一个实例,并且一旦创建了该实例就要保证能被整个系统使用。

常用单例

下面介绍下面试常问的懒汉式、饿汉式以及双重检查加锁的写法。

懒汉式

/**
 * @author 沉鱼
 * @date 2017/12/20 21:07
 */
public class LazySingleton {
    //太懒,实例都懒得创建,等外界要用的时候再创建
    private static LazySingleton singleton = null;
    //私有构造器,不允许外界创建实例
    private LazySingleton() {

    }
    //线程不安全,这也是面试的一个问点
    /*public static LazySingleton GetInstance() {
        if (singleton == null) {
            singleton = new LazySingleton();
        }
        return singleton;
    }*/
    //线程安全的一个写法
    public static synchronized LazySingleton getSingleton() {
        if (singleton == null) {
            singleton = new LazySingleton();
        }
        return singleton;
    }

}
特点

1、教你们一个记忆方式,因为太懒唯一的实例都要外界要用时才创建,所以叫懒汉式。
2、因为线程不安全加了synchronized 同步锁,从而降低实例访问速度,降低性能

饿汉式

/**
 * @author 沉鱼
 * @date 2017/12/20 21:28
 */
public class HungrySingleton {
    private static HungrySingleton singleton = new HungrySingleton();

    private HungrySingleton() {

    }

    public static HungrySingleton getSingleton() {
        return singleton;
    }
}
特点

1、因为太饿,在类的加载中就已经创建了实例
2、线程安全,消耗内存

双重检查加锁

/**
 * @author 沉鱼
 * @date 2017/12/20 21:35
 */
public class Singleton {
    private static Singleton singleton = null;

    private Singleton() {

    }
    public static Singleton getSingleton() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }

}
特点

1、双重判空,如果面试官在没有指定你要用懒汉或者饿汉的写法,单纯让你写单例的话,建议这样写

总结

单例的特点要保证

1、私有化构造器
2、静态对外提供获取实例的方法,保证整个系统都能访问到该实例

写博客虽然很浪费时间,但是有句话叫做好记性不如烂笔头,一方面加深自己映像,一方面若干年后翻看自己博客可以忆往昔感概多个夜晚在电脑前的噼里啪啦;当然如果有幸帮助到别人,那就非常有意义了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值