设计模式之单例模式

来源:互联网 发布:淘宝情侣装冬装 编辑:程序博客网 时间:2024/06/08 06:58

    单例模式,顾名思义,就是设计出来这样一种类型,这种类型在程序中只允许拥有一个实例的存在,其实,这样的场景在我们的日常生活之中并不少见,像足球比赛,篮球比赛等很多的球类运动在比赛之中就只拥有一个足球实例(或者是一个篮球实例等等),我这样说,大家对单例模式应该有一个大概的理解了吧,现在让我们想想这样一个类,应该如何设计呢?

    首先,这个类只能有一个实例,那么也就是说我们设计的这个类在外部的话,用户不能随随便便地创造自己的对象,而对象的创造必须调用该类的构造函数,于是一个很直接的想法是将类的构造函数声明为 private,这样就可以避免用户在外部实例化自己的对象。另外,既然外部已经无法实例化对象了,那么我们在类的内部就必须实例化出该类的唯一的一个对象,并且让用户通过一个类成员函数(static) GetInstance() 来取得该对象,代码如下:


以上的代码确实实现了单例模式,但还存在问题,什么问题呢?

没错,以上的代码在单线程下能够很好地进行工作,但是在多线程的程序中就出现问题了,因为


这段代码在多线程的环境之下存在一个竞争条件,试想一下,如果线程 A 执行到  时,线程的时间片完成,cpu 切换到线程 B,线程 B 在其时间片内执行了

之后,轮到线程 A 执行了,则线程 A 会接着执行下一条指令,也就是,这时,改变了 instance 的指向并且创建了另外一个实例,线程 B 创建的实例 “泄露”了,这其实就是多线程的同步问题,解决这个问题可以采用相关的线程同步技术,但有时需要考虑因为线程同步所带来的额外开销问题,这个需要根据具体的环境进行具体的分析。以下我给出我推荐的一种解决方案:

    谢谢阅读,如有意见和建议,欢迎交流!微笑






0 0
原创粉丝点击