单例模式

如何正确地写出单例模式

爱⌒轻易说出口 提交于 2019-12-01 00:05:49
懒汉式,线程不安全 懒汉式,线程安全 双重检验锁 饿汉式 static final field 静态内部类 static nested class 枚举 Enum 总结 Read More 单例模式算是设计模式中最容易理解,也是最容易手写代码的模式了吧。但是其中的坑却不少,所以也常作为面试题来考。本文主要对几种单例写法的整理,并分析其优缺点。很多都是一些老生常谈的问题,但如果你不知道如何创建一个线程安全的单例,不知道什么是双检锁,那这篇文章可能会帮助到你。 懒汉式,线程不安全 当被问到要实现一个单例模式时,很多人的第一反应是写出如下的代码,包括教科书上也是这样教我们的。 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 这段代码简单明了,而且使用了懒加载模式,但是却存在致命的问题。当有多个线程并行调用 getInstance() 的时候,就会创建多个实例。也就是说在多线程下不能正常工作。 懒汉式,线程安全 为了解决上面的问题

单例设计模式入门

帅比萌擦擦* 提交于 2019-11-30 23:44:45
                                    单例模式 单例模式, 在很多的框架底层都有使用spring底层使用居多,单例模式(在多线程环境下,对外存在一个对象)单例模式的实现有三种方式1: 1: 构造器私有化,避免外部new构造器 2: 提供私有的静态属性,存储对象的地址 3; 提供公共的静态方法 , 获取属性 单例模式 核心作用: 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。 单例模式的场景:(经常new对象,很耗资源) 1: 项目中 读取配置文件的类,一般也只有一个对象,没有必要每次使用配置文件数据,每次new一个对象去读取 2:网站的计数器,一般采用单例模式,否则难以同步 3数据库的连接池的设计一般使用单例模式,因为数据库连接是一种数据库资源。 4:操作系统的文件系统,是大的单例模式实现的例子,一个操作系统只能有一个文件系统。 5:pplication,也是单例的典型应用(Servlect 编程中会涉及到) 6:在Spring中,每个Bean默认就是单例的,这样做的优点是Spring容器可以管理 7:springMVC框架/strust1框架中,控制器对象也是单例 单例模式的优点: - 由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要较多的资源的时候, 如读取配置,产生其他依赖对象时

单例模式解读

时间秒杀一切 提交于 2019-11-30 22:52:11
单例模式 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。 要点主要有三个: 一个类只能有一个对象; 必须是自行创建这个类的对象; 要想整个系统提供这一个对象; 从具体实现角度来说,就是以下三点: 一、单例模式的类只提供私有的构造函数, 二、类定义中含有一个该类的静态私有对象, 三、该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。 当然还要有一个private的clone方法,防止克隆; 为什么要使用PHP单例模式? php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。 提高创建速度,每次都获取已经存在的对象因此提高创建速度全局共享对象。 单例在系统中只存在一个对象实例,因此任何地方使用此对象都是一个对象避免多实例创建使用时产生的逻辑错误。 <?php /** * 设计模式之单例模式 * $_instance必须声明为静态的私有变量 * 构造函数和析构函数必须声明为私有,防止外部程序new * 类从而失去单例模式的意义 * getInstance()方法必须设置为公有的,必须调用此方法 * 以返回实例的一个引用 * ::操作符只能访问静态变量和静态函数

设计模式——单例模式的一种比较好的写法

别说谁变了你拦得住时间么 提交于 2019-11-30 18:41:49
单例模式的一种比较好的写法 package com.volvane.JOffer.test; public class DoubleCheckSingleton { private static DoubleCheckSingleton instance; private DoubleCheckSingleton() { } /** * getInstance 进行了两次判空,第一次判空是为了不必要的同步,第二次判空为了在instance 为 null 的情况下创建实例 * 既保证了线程安全且单例对象初始化后调用getInstance又不会进行同步锁判断 * <p> * 优点:资源利用率高,效率高 * 缺点:第一次加载稍慢,由于java处理器允许乱序执行,偶尔会失败 * * @return */ public static DoubleCheckSingleton getInstance() { if (instance == null) { synchronized (DoubleCheckSingleton.class) { /* * 第二次判空,是因为,第一次的时候判空的时候, * 如果又两个线程a,b同时进“if (instance == null) {”后, * 假设线程a先拿到锁,则b等待 ,a创建了个instance对象,释放锁后, * 线程b进入

设计模式-单例

久未见 提交于 2019-11-30 17:02:52
上周开发的时候需要做一个校验用户姓名格式的类,因为提供的是公共功能,类似于工具类,所以最好拿来就能用。内部逻辑大体如下所示: public class NameValidateUtil { // 校验姓名格式是否满足要求 public boolean validateName (String name) { // 判断是不是汉字的姓名 if (isChineseName(name)) { // 是汉字,就用汉字的校验逻辑 return validateChineseName(name); } else { // 否则是英文,用英文的校验逻辑 return validateEnglishName(name); } } private boolean validateEnglishName(String name) { // 此处省略校验逻辑 return true; } private boolean validateChineseName(String name) { // 此处省略校验逻辑 return true; } private boolean isChineseName(String name) { // 此处省略判断逻辑 return false; } }   可以看到,校验逻辑比较多,不适合放在一个方法里,如果给每一个方法都加上static也可以做到拿来即用

单例模式

扶醉桌前 提交于 2019-11-30 10:34:33
介绍 类的单例设计模式,就是采取一定的方法来保证在整个软件系统中,某个类只存在一个对象实例。且该类只提供一个取得其对象实例的方法(静态方法)。 八种方式 单例模式有八种方式: 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全,同步代码块) 双重检查 静态内部类 枚举 步骤 步骤大致如下: 构造器私有化(防止外部new) 类的内部创建对象 向外提供一个静态公共方法(getInstance) 饿汉式(静态常量) 代码: package singleton.type1; public class Singleton { private Singleton() { } private static final Singleton instance = new Singleton(); public static Singleton getInstance() { return instance; } } 测试代码: package singleton.type1; public class SingletonTest { public static void main(String[] args) { Singleton instance = Singleton.getInstance(); Singleton

php单例模式的常见应用场景

笑着哭i 提交于 2019-11-30 10:29:50
单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此有些设计大师并把把其称为设计模式之一。 这里又不具体讲如何实现单例模式和介绍其原理(因为这方便的已经有太多的好文章介绍了),如果对单例模式不了解的可以先看下:http://terrylee.cnblogs.com/archive/2005/12/09/293509.html 。当然也可以自己搜索。 好多没怎么使用过的人可能会想,单例模式感觉不怎么用到,实际的应用场景有哪些呢?以下,我将列出一些就在咱们周边和很有意义的单例应用场景。 1. Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~ 2. windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。 3. 网站的计数器,一般也是采用单例模式实现,否则难以同步。 4. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。 5. Web应用的配置对象的读取

java之单例模式

安稳与你 提交于 2019-11-30 10:10:14
# 单例模式 ## 定义 --- 权威定义:确保一个类只有一个实例,并提供一个全局访问点。 --- 博主的理解:虽说单例模式对于许多人来说并不难,但是其中也是有很多需要注意的细节的。 --- 我的理解:整个项目中只有一个类的实例,并且是共享的。 --- ## 设计方案 --- ### 方案一:立即初始化的单例 --- 思路:在一开始的时候就创建出类的单例实例,不管有无实际需求。满足了单例设计模式的需求。 --- #### 设计关键: --- 私有化构造器,静态变量new一个类实现单例; --- #### 设计问题 --- 如果一直不需要这个单例,或者系统设计中有一大堆的单例,那么会影响性能! --- #### 代码 --- ``` package singleton; /** * 立即初始化的单例模式 */ public class SingletonEagerly { // 静态变量设置全局的单例singletonEagerly public static SingletonEagerly singletonEagerly = new SingletonEagerly(); // 私有化构造器 private SingletonEagerly() { } } ``` --- ### 方案二:懒惰初始化的单例 --- 思路:类提供一个供对外访问的静态方法getInstance(

java设计模式——单例模式

隐身守侯 提交于 2019-11-30 09:21:53
单例模式的使用动机 某些系统中的某些类的对象只需要一个, 或者只能是一个, 如果多于一个甚至会出现错误,这时候我们就要用到单例模式。日志对象, 打印池对象, 序列ID生成器等应用。单例模式可以让系统在减少内存空间的情况下仍然能正常工作。 生成单例的方式:1.懒汉式(线程不安全);2.懒汉式(线程安全);3.饿汉式;4.静态内部类; 5.双重检验锁;6.枚举 这里只介绍下:双重检验锁。貌似现在都这个比较多。 其他单例模式可以参考: https://www.zybuluo.com/pastqing/note/164787 http://cantellow.iteye.com/blog/838473 双重校验锁 public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } } 为什么要判断两次 singleton

设计模式 —— 单例模式, Singleton Patttern

左心房为你撑大大i 提交于 2019-11-30 09:21:41
参考资料: http://wuchong.me/blog/2014/08/28/how-to-correctly-write-singleton-pattern/ http://blog.csdn.net/qq_17766199/article/details/50225395 http://www.cnblogs.com/coffee/archive/2011/12/05/inside-java-singleton.html 《android 源码设计模式解析与实战》 - Capter2, P23 《Head First 设计模式》 - Capter5, P169 示例程序: https://github.com/saragitshare/PatternDesignDemo/tree/master/SingletonPatttern/src 1 单例模式,又称之为单件模式,英文名为Singleton Patttern 2 单例模式的定义:确保一个类只有一个示例,并提供一个全局访问点。 3 何时需要单例模式? 某个类有且只有一个对象。如果有多个实例,会导致很多问题:程序的行为异常,资源使用过量,或者不一致的结果等。 单例模式常用来管理共享的资源,以及解决创建一个对象需要消耗的资源过多的问题。 常见的例子:数据库连接池,线程池(ThreadPool),缓存(cache),对话框