本文系原创,转载请注明:http://www.cnblogs.com/inevermore/p/4014577.html   根据维基百科,对单例模式的描述是: 确保一个类只有一个实例,并提供对该实例的全局访问. 从这段话,我们可以得出单例模式的最重要特点: 一个类最多只有一个对象   单线程环境   对于一个普通的类,我们可以任意的生成对象,所以我们为了避免生成太多的类,需要将类的构造函数设置为私有. 所以我们写出第一步: class Singleton { public: private…
双重锁实现单例时遭到质疑,既是:双重锁也无法保证单例模式! 原因是:指令会重排序,普通的变量仅仅会保证该方法在执行时,所有依赖的赋值结果是正确的,但不会保证执行顺序! 为什么会重排序:指令重排序是指cpu采用了允许将多条指令不按照程序的顺序分开发送各相应电路单元处理,cpu不会任意排序(深入java虚拟机第12章),但需要重排序提高性能. 怎么解决,标题也写明白了. 使用volatile关键字! 为什么使用volatile关键字可以实现:此关键字会禁止指令重排序,即:增加了内存屏障! 如果是一个…
以我的经验为例(如有不对欢迎指正),在生产过程中,经常会遇到下面两种情况: 1.封装的某个类不包含具有具体业务含义的类成员变量,是对业务动作的封装,如MVC中的各层(HTTPRequest对象以Threadlocal方式传递进来的). 2.某个类具有全局意义,一旦实例化为对象则对象可被全局使用.如某个类封装了全球的地理位置信息及获取某位置信息的方法(不考虑地球爆炸,板块移动),信息不会变动且可被全局使用. 3.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.如用来封装…
单例模式如下: 需要volatile关键字的原因是,在并发情况下,如果没有volatile关键字,在第5行会出现问题. instance = new TestInstance();可以分解为3行伪代码 a.memory = allocate() //分配内存 b. ctorInstanc(memory) //初始化对象 c. instance = memory //设置instance指向刚分配的地址 上面的代码在编译运行时,可能会出现重排序从a-b-c排序为a-c-b.在多线程的情况下会出现以…
单例模式,有“懒汉式”和“饿汉式”两种. 懒汉式 单例类的实例在第一次被引用时候才被初始化. public class Singleton { private static Singleton instance=null; private Singleton() { } public static Singleton getInstance(){ if (instance == null) { instance = new Singleton(); } return instance; } }…
Qt中实现单例模式(SingleTon) 单例模式分为“饥汉”和“饿汉”两种版本,也正是线程安全问题使得原本简单的单例模式变得复杂.由于单例模式很常用,Boost库中有强大的泛型单例实现,我也利用Qt的原子指针QAtomicPointer来实现Qt中的单例模式: //.cppclass SingleTon{ public: /*! \brief 用于获得SingleTon实例,使用单例模式. * \return SingleTon实例的引用. */ static SingleTon &getIn…
工厂模式 普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 多个工厂模式,编写多个创建工厂的方法即可. 静态工厂模式,在多个工厂模式的基础上把Factory种方法的返回值标明位静态即可. 抽象工厂模式 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码…
关于双重检验锁首先简单来看一个小例子: public class Singleton{ private static Singleton instance = null; private Singleton(){} public static Singleton getInstance(){ if (instance == null) {//e1 synchronized(Singleton.class){ if (instance == null) {//e2 instance = new S…
介绍 双重校验锁是单例模式中,饿汉式的一种实现方式.因为有两次判空校验,所以叫双重校验锁,一次是在同步代码块外,一次是在同步代码块内. 为什么在同步代码块内还要再检验一次? 第一个if减少性能开销,第二个if避免生成多个对象实例. 现有三个线程A,B,C,假设线程A和线程B同时调用getSingleton()时,判断第一层if判断都为空,这时线程A先拿到锁,线程B在代码块外层等待.线程A进行第二层if判断,条件成立后new了一个新对象,创建完成,释放锁,线程B拿到锁,进行第二层if判断,sing…
一. /** * lazy man(不是线程安全的) * @author TMAC-J * */ public class Singleton { private static Singleton instance; private Singleton(){} public static Singleton getInstance(){ if(instance!=null){ instance = new Singleton(); } return instance; } } 二. /** *…
一.单例模式的C#实现: (1)使用double-checked locking的方式: public sealed class Singleton { private static volatile Singleton instance = null; private static readonly object padlock = new object(); private Singleton() { } public static Singleton Instance { get { if…
概述 一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称):当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用:同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例. 特点 根据上面所述,单例模式有如下特点: 单例类只能有一个实例: 单例类必须自己创建自…
单例模式(Singleton) 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 目的:使得类的一个对象成为系统中的唯一实例. 如何保证一个类只有一个实例并且这个实例易于被访问呢? 我们都知道,一个类多次被new 创建后,获取的是不同实例. 创建一个类 public class NewObject { } 测试 public class NewOne { public static void main(String[] args) { NewObject no1= new NewOb…
单件模式 Singleton 什么时候使用?当需要独一无二的对象时,请想起他. 举例:线程池(threadpool),缓存(cache),对话框,处理偏好设置和注册表(registry)的对象,驱动程序对象. 无需具体例子,先看类图:包含一个private的自己的实例.private的构造函数,确保无法在类以外创建.在getInstance()中检测私有实例是否创建,未则创建,若已存在则直接返回. 看代码更好理解记忆. 经典实现方式 Typical Singleton public class…
http://blog.sina.com.cn/s/blog_89d90b7c0101805m.html 单例模式:意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类.这个其实很好理解,废话不多说,看代码. java版本: 一,经典模式: public class Singleton { private static Singleton uniqueInstance = null; private Singleton() { // E…
1. 饿汉式 实现代码: public class Singleton { private Singleton() { } private static Singleton singleton = new Singleton(); public static Singleton getInstance() { return singleton; } } 验证一下: public static void main(String[] args) { Singleton s1 = Singleton.…
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com Singleton 单例模式 设计模式 Single 目录 目录简介单例模式的几种方式饿汉式:简单安全,但浪费资源懒汉式简单懒汉式:高效,但不安全加同步锁方式:性能差双重检查加锁模式:高效且安全基本形式存在的安全隐患:指令重排序添加 volatile 后的终极形式静态内部类方式:[推荐]枚…
这个设计模式主要目的是想在整个系统中仅仅能出现一个类的实例.这样做当然是有必定的.比方你的软件的全局配置信息,或者是一个Factory,或是一个主控类,等等. 你希望这个类在整个系统中仅仅能出现一个实例. 一.调用pthread_once()实现了一个线程安全的版本号: pthread_once()函数具体解释 代码: template <class T> class Singleton { public: static T& instance() { pthread_once(&am…
Introduction 对于系统中的某个类来说,只有一个实例是很重要的,比如只有一个timer和ID Producer.又比如在服务器程序中,配置信息保留在一个文件中,这些配置信息由一个单例对象统一获取,进程中的其他对象通过这个单例对象获取这些配置信息,这种方式能大大简化复杂环境下的配置管理. 所以这个时候一个类里面就只能有一个实例,而且这个实例要易于访问.我当然可以只定义一个全局变量可以保证对象随时都能访问,但是这种方式我依然可以实例化多个instance,而且被不同的对象所持有,不是很妙.…
今天开始学习设计模式,借此机会学习并整理学习笔记. 设计模式是一门不区分语言的课程,什么样的编程语言都可以用到设计模式.如果说java语法规则比作武功招式的话,那么设计模式就是心法. 设计模式共有23种,常见的19种,最常用的9-10种. 设计模式分三种类型:创建型.结构型.行为型: 其中创建型包含单例设计模式.工厂模式.抽象工厂模式.原型模式.建造者模式:结构型包含代理模式.装饰器模式.适配器模式.外观模式.组合模式.享元模式.桥梁模式:行为型包含:策略模式.责任链模式.命令模式.中介者模式.…
单例模式基本要点: 用于确保一个类只有一个实例,并且这个实例易于被访问. 让类自身负责保存他的唯一实例.这个类可以保证没有其他实例创建,并且他可以提供一个访问实例的方法,来实现单例模式. (1)把构造方法声明为 private ,确保只能由自己创建,避免外部创建实例或被子类继承从而创建额外实例. (2)定义一个私有静态的该类的实例作为该类的数据域,确保一个类只有一个实例. (3)定义一个静态工厂方法,外部类不能实例化一个该类的对象,所有只能用static的方法,提供给其它类调用返回此单例类的唯一…
单例的目的是为了保证运行时Singleton类只有唯一的一个实例,用于一些较大开销的操作. 饿汉式(没有线程安全问题): ' 由于使用static关键字进行了修饰,只能获取到一个对象,从而达到了单例,并且在Singleton类初始化的时候就创建了对象,加载到了内存. 问题:在没有使用这个对象的情况下就加载到内存是一种很大的浪费. 针对这种情况,有一种新的思想提出--延迟加载,也就是所谓的懒汉式. 懒汉式(存在线程安全问题): 这种方法在调用Singleton.getInstance()时才会创建…
Singleton 模式 单例模式(Singleton Pattern)是 C++/Java等语言中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式实现了类只能创建唯一实例的功能.并且由该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象. 单例模式有三种经典的设计方案: 延时加载,也称为懒汉模式 ,需要的时候才创建对象,也就是下面方法一用到的 双重锁模式,需要的时候才创…
面试题2:实现Singleton 模式 题目:设计一个类,我们只能生成该类的一个实例.   只能生成一个实例的类是实现了Singleton (单例)模式的类型.由于设计模式在面向对象程序设计中起着举足轻重的作用,在面试过程中很多公司都喜欢问一些与设计模式相关的问题.在常用的模式中, Singleton是唯一一个能够用短短几十行代码完整实现的模式.因此,写一个Singleton的类型是一个很常见的面试题. 单例模式有三种经典的设计方案: 延时加载,也称为懒汉模式 ,需要的时候才创建对象,也就是下面…
对今天学习的Singleton Pattern简单总结下: 定义:保证一个类只有一个实例,必须自己创建自己的实例,并提供一个访问它的全局访问点. private 构造函数: private static 成员变量:缓存实例: public static 方法:创建类实例: 作用 保证唯一实例,减少内存开支,避免对资源的多重占用: 提供对唯一实例的受控访问: 全局变量必须在程序一开始就创建好,单例模式可以延迟初始化: 适用场合 控制资源的使用,通过线程同步来控制资源的并发访问: 控制实例产生的数量…
1.//懒汉模式 //天生线程不安全,但是效率高 public class Singleton { private static Singleton singleton; private Singleton() {} public static Singleton getSingleton(){ if(singleton==null){ singleton=new Singleton(); System.out.println("实例化Singleton"); } return sin…
最简单的单例「饿汉式」  public class Singleton{ private static Singleton instance=new Singleton();    //other fields    private Singleton(){}     public static Singleton getInstance(){         return instance;    }     //other methods} 出于性能等方面的考虑,希望延迟实例化单例对象(st…
Design Pattern —— Singleton   强力推荐枚举和类级内部类方式实现单例模式 单例模式是开发中非常常用的一种模式,简单的说,我们希望一个类永远都只有一个对象. 主要有两个用途: 1.存储一些进程内共享的值(不是很推荐,大部分情况下还是应该用局部变量,互相传递值的方式) 2.任何时候都不变的操作 单例模式的实现目前已知的有五种: 1.饿汉式 2.懒汉式 3.双重验证 4.类级内部类 5.枚举 一.饿汉式 类加载时就创建好对象,以空间换时间.这样外部调用EagerSingle…
单例,故名思议,一个只能创建一个实例的类. 单例被广泛应用于Spring的bean(默认).线程池.数据库连接池.缓存,还有其他一些无状态的类如servlet. 一个没必要多例的类实现了单例可以节约空间(显而易见),节省资源(线程.数据库连接). 单例模式有这么多好处,那我们来实现它吧,首先想到的是创建一个对象要使用new方法,new方法调用的是类的构造函数,想要不被程序员随意的new对象可以将类的构造函数设为私有,然后再提供一个获取这个类实例的方法,所以就有了下面这个实现. 1.只能正确运行在…
锁与volatile的内存语义 1.锁的内存语义 2.volatile内存语义 3.synchronized内存语义 4.Lock与synchronized的区别 5.ReentrantLock源码实例分析 1.锁的内存语义 锁是java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息. 1.1 锁释放和获取的内存语义 当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中: 当线程获取锁时,JMM会当前线程拥有的本地内存共…