创建型模式--(再论)单例模式

创建型模式--单例模式 一文中我们提到单例模式,就是

一个类仅有一个实例,并提供一个访问它的全局访问点。

那么问题来了,我们以上一篇中代码为例:

<pre name="code" class="java">/**
 * 定义一个Instance操作,允许客户访问它的唯一实例。
 * Instance是一个类操作。
 * 负责创建它自己的唯一实例。
 * @author Linhai Gu
 *
 */
public class Singleton {
	private static Singleton singleton;
	private Singleton(){}
	public static Singleton getInstance(){
		if(null==singleton){
			singleton=new Singleton();
		}
		return singleton;
	}

}

现在假设有两个线程分别是线程A,线程B,现在线程A访问到了

singleton=new Singleton();

,我们知道当new个对象时,需要申请内存分配,如果申请耗时可能需要几纳秒,也就是在这几纳秒内,线程B执行到了

if(null==singleton)

这时线程A还没申请完毕,singleton为null,线程B也往if里走,这时线程B也去申请内存分配,这样下去就会造成数据的不唯一性。

解决方案:

public class Singleton {
	private static final Singleton singleton=new Singleton();
	private Singleton(){}
	public synchronized static Singleton getInstance(){
		return singleton;
	}

}

我们直接去new 一个对象传递给类的成员变量singleton,需要的时候直接通过getInstance方法返回就行了。

转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/42190605 
 情绪控_

时间: 2024-10-14 15:46:52

创建型模式--(再论)单例模式的相关文章

设计模式(四) : 创建型模式--单例模式

单例模式的话,类图上来看是最简单的设计模式,就是一个类只能有一个自己的实例. 单例模式通常来说我们就有Lazy loading的和不是Lazy loading的.<java与模式>里面的关于这两种的类图,: 可以看到一个是现开始就实例话的,这样的话不符合我们的lazy loading,还有一种是在getinstance方法里头去new的,这样的话会有线程安全的问题,我们提供了双重检查锁. 下面看示意代碼︰ 1. 静态初始化: package com.javadesignpattern.Sing

设计模式之创建型模式—— 1.4 单例模式

<?php /**  * 1.4 单例模式  *  解决的问题:  *   如何确保一个特殊类的实例是独一无二的  *   ,也就是说这个实例是它所属类的唯一一  *   个实例对象,并且很容易的对它进行存取?  *  解决的方案:  *   保证一个类仅有一个实例,并提供一个访  *   问它的全局访问点.  *  该模式包含一种角色:  *   1. 单例角色  *  优点:  *   1. 始终保持唯一的一个实例.  *   2. 可对此唯一实例进行访问控制.  *  缺点:  *   1

Java设计模式——单例模式(创建型模式)

概述 ??单例模式保证对于每一个类加载器,一个类仅有一个实例并且提供全局的访问.其是一种对象创建型模式.对于单例模式主要适用以下几个场景: 系统只需要一个实例对象,如提供一个唯一的序列号生成器 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例 ??单例模式的缺点之一是在分布式环境中,如果因为单例模式而产生 bugs,那么很难通过调试找出问题所在,因为在单个类加载器下进行调试,并不会出现问题. 实现方式 ??一般来说,实现枚举有五种方式:饿汉式.懒汉式.双

3创建型模式之单例模式

概念 单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象.也就是说,在整个程序空间中,该类只存在一个实例对象. GoF对单例模式的定义是:保证一个类.只有一个实例存在,同时提供能对该实例加以访问的全局访问方法. 为什么使用单例模式? 在应用系统开发中,我们常常有以下需求: - 在多个线程之间,比如初始化一次socket资源:比如servlet环境,共享同一个资源或者操作同一个对象 - 在整个程序空间使用全局变量,共享资源 - 大规模系统中,为了性能的考虑,需要节省对

创建型模式:单例模式

文章首发:创建型模式:单例模式 简介 姓名:单例模式 英文名:Singleton Pattern 价值观:我的生活我主宰(只允许自己实例化,不愿意被其他对象实例化) 个人介绍: Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.)(来自<设计模式之禅>) 这里的关注点有 3 个,分别是: 只有一个实例 自行实例化(也

创建型模式 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

说起模式来大家都很头疼.大篇的介绍和概念,还有类图.. 一 简单工厂模式不属于23中涉及模式,简单工厂一般分为:普通简单工厂.多方法简单工厂.静态方法简单工厂. 简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.它又称为静态工厂方法模式,属于类的创建型模式. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 普通简单工厂  多方法简单工厂 静态方法简单工厂 class SimpleFacto

设计模式---创建型模式

一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. (3)行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 二.设计模式的六大原则 1.开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修

设计模式——创建型模式

简单的说我们可以把23种设计模式可以归为三大类,分别是创建型模式.结构型模式和行为型模式. 今天,首先看一下创建型模式.创建型设计模式包括5种:单例模式(Singleton).工厂方法模式(Factory Method).抽象工厂模式(Abstract Factory).建造者模式(Builder).原型模式(Prototype).  1.单例模式(Singleton)        1)简介 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的软件设计模式.在它的核心结

(转)Java经典设计模式(1):五大创建型模式(附实例和详解)

原文出处: 小宝鸽 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. (3)行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 二.设计模式的六大原则 1.开闭原则(Open Close Principle) 开闭原则就