单件模式----我要吃巧克力

欢迎来到这一站
单件模式(Singleton Pattern):用来创建独一无二的,只能有一个实例的对象的入场券。

单件模式——我要吃巧克力。几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销。再如大家最经常用的IM,如飞信、QQ,在同一台电脑,一个帐号只能有唯一的登录。穿越时空,我们来到了巧克力制造厂

大家都知道,现代化的巧克力工厂具备计算机控制的巧克力锅炉,锅炉做的事,就是把巧克力和牛奶以及其他原料融在一起,然后送到下一个阶段,一制成美味巧克力。这里有一个Cho-colate
公司的工业强度巧克力锅炉控制器。看看他的代码,你会发现代码写的相当小心,已经用单件模式完美的制作出一炉可口美味的巧克力,当正打包运货的过程中,巧克力锅炉溢出了……原料溢出了

我们来看框中的那一部分代码,假如现在有两个线程A和线程B,当线程A在0.0时刻判断uniqueInstance是否为空(0.0时刻判断巧克力锅是否为空,是空,则想巧克力锅中加入制作原料),也就是线程A执行到this.singletonPattern=newSingletonPattern(),正在申请内存分配,可能在3.0时刻才能new出对象并返回(3.0时刻巧克力棒真正生成,并可以拿着吃了);在2.0时刻之内,线程B执行到if(this.singletonPattern==null),此时的这个判断条件是true还是false?
是true(线程B访问判断时,还是为空,于是再次加入巧克力原料),溢出来了!巧克力原料溢出来了!
在内存中就有两个new出的实例,这样不就存在问题了么。

就这种情况,如何修改,怎么解决,于是引出第一种修改方案:只要把getInstance()变成同步(Synchronized)方法,多线程灾难几乎就可以轻易地解决;

 
                在多个进程访问的时候,必须等第一个进程结束才能依次继续访问,大大地影响运行效率。为了符合大多数java应用程序,很明显地,我们需要确保单件模式能在多线程状况先正常工作。此时第一种修改方案已经不满足需求,我们是否应该想到第二种方案呢?

如果应用程序总是创建并使用单件实例,或者在创建和运行时方面的负担不太繁重,我们可能想急切创建此单件,利用这个做法,保证在任县线程访问uniqueInstance静态变量之前,一定先创建此实例。

在Static
静态声明变量,new出的对象一直占存内存,影响内存性能。

利用双重检查加锁,首先检查是否实例已经创建了,如果实例未创建,“才”进行同步,这样一来,只有第一次会同步,这才是我正真想要的。

再度回到巧克力工厂……

此刻,巧克力工厂的问题已经解决了,而且Cho-colate
公司很高兴在锅炉的代码中能够采用这些专业知识。不管你使用哪一种对线程解决方案,锅炉都能顺畅工作,不会有闪失。

时间: 2024-07-30 14:39:32

单件模式----我要吃巧克力的相关文章

【C#设计模式】01.你真的知道线程安全的“单件模式”吗?

概述: 单件模式的类图可以说是所有模式的类图中最简单的,事实上,它的类图上只有一个类. 尽管从设计的视角来说它很简单,但是实现上还是会遇到相当多的波折. 一.职责: 1.保证一个类有且仅有一个实例 2.且提供一个全局访问点 二.代码中需要用到的地方 线程池(Thread Pool)/缓存(cache)/对话框/处理偏好设置和注册表的对象/日志对象/充当打印机/显卡等设备的驱动程序的对象. 三.生活中用到的地方 1.考勤记录仪可以有多台,但是时钟必须只有一个,所有的考勤记录必须根据这个时钟来生成打

设计模式(六):Singleton 单件模式 -- 创建型模式

1.定义 当需要控制一个类的实例数量且调用者可以从一个公共的访问点访问时. 2.适用场景 1. 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 2. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时. 3.评价 优点: 1. 对唯一实例的受控访问, 因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它. 2. 缩小名空间,Singleton模式是对全局变量的一种改进.它避免了那些存储唯一实例的全局变量污染名空

设计模式 - 单件模式(singleton pattern) 详解

单件模式(singleton pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28595349 单件模式(singleton pattern) : 确保一个类只有一个实例, 并提供一个全局访问点. 单价模式包括3个部分: 私有构造器, 静态变量, 静态方法. 具体方法: 1. 标准的单例模式: /** * @time 2014.6.5 */ package singleton; /** * @author

说说设计模式~单件模式(Singleton)

单件模式(Singleton)要求一个类有且仅有一个实例,并且提供了一个全局的访问点. 从概念上来研究一下它的实现,不考虑线程安全 1 public sealed class Singlton 2 { 3 static Singlton instance = null; 4 private Singlton() { } 6 7 public static Singlton Instance 8 { 9 get 10 { 11 if (instance == null) 12 { 13 insta

Java设计模式——线程安全的单件模式

单件模式,也称单例模式,用以创建独一无二的.只能有一个实例的对象. 单件模式的类图是所有模式的类图中最简单的--只有一个类.尽管从类设计的视角来看单件模式很简单,但是实现上还是会遇到一些问题,本文着重对这一点来进行分析解决. 最简单的单件模式的实现,代码如下: 1 /** 2 * Created by McBye King on 2016/10/23. 3 */ 4 public class Singleton { 5 private static Singleton singleton; 6

单件模式详解:懒汉式与饿汉式

class Instance{} //懒汉式 class LSingle{ private static  Instance _instance = null; private LSingle(){} public static Instance getInstance(){ if(_instance==null){ synchronized(LSingle.class){ _instance = new Instance(); } } return _instance; } } //饿汉式 c

设计模式(5)--单件模式

同步一个方法可能造成程序执行效率下降100倍. 静态初始化的控制权是在Java手上 一个类,一个责任 原则. ( 类应该做一件事,而且只做一件事)  但单件做了两件事, 一是 管理自己的实例(并提供全局访问变量) 二是在应用程序中担任角色, (1). 私有构造器.不提供对外访问   (2). 静态方法对外提供类本身实例.    (3)  . 只有一个实例 单例模式:  ( 管理共享资源 如数据库连接,或者线程池)  MVC  DAO Service 层 延迟实例化(懒汉式) 有线程安全问题  -

基础工具-单件模式

作为C++设计模式中的单件模式归属于创建型模式之一,在软件设计过程中"出场"的机会还是很多,以下源码作为自己学习开源库代码时针对单件 模式做的一个总结,方便后期设计过程中的参考和学习. #ifndef SINGLETON_HPP_ #define SINGLETON_HPP_ #include <boost/thread.hpp> namespace ts { /** *@breif *@note base */ class CLocalStaticInstantiatio

单件模式(Singleton创建型)c#简单例子

单件(Singleton创建型模式)c#简单例子 需要生成一个实例时,可采用单件模式 例子中只可生成一个玩家,并对玩家进行测试.单线程例子如下: namespace singletonpattern { public partial class SingletonForm : Form { public SingletonForm() { InitializeComponent(); } private void btnDisplay_Click(object sender, EventArgs