前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【设计模式】单例模式

【设计模式】单例模式

作者头像
Leetcode名企之路
发布2018-10-25 11:19:10
3590
发布2018-10-25 11:19:10
举报
文章被收录于专栏:Leetcode名企之路Leetcode名企之路

前几天面试一个校招的小朋友,让他写单例模式,没写出来,所以这里把两年前我的学习笔记发一下。这应该是所有设计模式中最简单的设计模式了,从它讲起。

用途

用来创建独一无二对象。确保只有一个实例,并且提供一个全局访问点(getSingleton)。

v0.0.1-简单实现

代码语言:javascript
复制
/**
 * Created by Acceml on 2016/5/28.
 * Email: huminghit@gmail.com
 */
public class Singleton {
    private static Singleton singleton;

    private Singleton() {
    }

    public static Singleton getSingleton() {
        if(singleton == null) {//risk
            return new Singleton();
        }
        return singleton;
    }
}

要注意的点是:

  • 单例模式没有public的construct
  • 有一个静态的对象,每次getSingleton()的时候获得的是同一个

这样写的问题是: 多线程的时候回出问题,比如我们有两个线程thread0,thread1去同时调用getSingleton()这个方法,就会在if(singleton == null)出现问题。thread0,thread1都认为没有该判断为true,就会去创建两个对象,没有多线程的时候,这样使用没有问题。

V0.0.2-双检查实现

代码语言:javascript
复制
/**
 * Created by Acceml on 2016/5/28.
 * Email: huminghit@gmail.com
 */
public class Singleton {
    private volatile static Singleton singleton;

    private Singleton() {
    }

    public static Singleton getSingleton() {
        if(singleton == null) {//判断1
            synchronized (Singleton.class) {
                if(singleton == null) {//判断2
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

变化有:

  • 加了volatile关键字
  • 加了双重锁 加volatile很容易理解,因为加上该关键字,那么变量就对不同线程可见。在方法getSingleton()中,第一个判断不存在,就进入同步块,进入同步块之后再判断一次,还是为null才创建实例。但是为什么这么做呢?假如thread0执行到判断1,它进入同步区之后,thread2就进不来了,从而保证只有一个线程执行到判断2。

v0.0.3-eager实现

上面两种方法都是我们需要的时候去做判断,然后实例化,如果创建对象负担不重的话,可以考虑在静态初始化的时候创建对象。

代码语言:javascript
复制
/**
 * Created by Acceml on 2016/5/28.
 * Email: huminghit@gmail.com
 */
public class Singleton {
    private volatile static Singleton singleton = new Singleton();

    private Singleton() {
    }

    public static Singleton getSingleton() {
        return singleton;
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Leetcode名企之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用途
  • v0.0.1-简单实现
  • V0.0.2-双检查实现
  • v0.0.3-eager实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档