单例模式

设计模式之单例模式

五迷三道 提交于 2020-02-29 02:49:41
单例模式是各场景下常用的一种模式。 安全的double check的实现 注意点 构造函数为private修饰,不让外部直接调用创建类 两次if判断instance是否为空。第一层是为了判断如果instance存在直接返回,第二层在synchronized内判断是为了解决当一个线程进入,另外排队等待锁的线程在第一个线程释放锁之后重复创建instance对象。 volatile为了解决禁止指令重排序。instance = new instance 在jvm实际上分为三步,1分配空间,2初始化对象,3分配引用。 在jvm实际执行会存在优化的情况,执行顺序可能有123,132。volatile可以禁止指令重排序。 最后volatile的作用, 禁止指令重排序 内存可见性 来源: oschina 链接: https://my.oschina.net/u/2250599/blog/3176221

单例模式

蓝咒 提交于 2020-02-28 20:06:25
1、什么是单例模式: 一个类在任何情况下只有一个实例,并提供一个全局访问点 特点:构造方法私有化 2、单例模式有哪些:饿汉、懒汉、注册式单例 (1)饿汉模式 直接实例化一个对象 优点:执行效率高,可以直接创建实例 缺点:在一定情况下,会造成内存资源浪费 public class HungrySingleton { private static final HungrySingleton hungrySingleton = new HungrySingleton(); private HungrySingleton(){ } public static HungrySingleton getInstance(){ return hungrySingleton; } } (2)懒汉模式 在需要的时候创建实例 优点:合理的安排了资源 缺点:线程不安全(通过双重锁和内部类可以解决) public class LazySingleton { public static LazySingleton lazySingLeton=null; private LazySingleton(){}; /** * 懒汉模式 * 优点:使用时创建,不浪费资源内存 * 缺点:线程不安全 * @return */ public static LazySingleton getInstance(){ if

设计模式-单例模式

浪尽此生 提交于 2020-02-28 19:58:55
###单例模式 ####单例模式特点 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 windows中的任务管理器 操作系统的文件系统,一个操作系统只能有一个文件系统 servlet编程中,每个servlet也是单例 SpringMVC中,控制对象也是单例 Spring中的bean ####单例模式分类 #####饿汉式 特点:减少系统开销 public class SingletonDemo { //类初始化的时候立即加载(没有延时加载的优势),由于加载类的时候天热的线程安全 private static final SingletonDemo singleDemo = new SingletonDemo(); //私有化构造器 private SingletonDemo() { } //方法没有同步,调用效率高 public static SingletonDemo getInstance(){ return singleDemo; } } #####懒汉式 ######懒汉式普通实现 特点:真正用的时候加载,资源的利用率高,但是每次调用的时候需要同步,并发下效率低 public class SingletonDemo1 { //调用的时候加载 private static SingletonDemo1 instance = null; //私有化构造器

单例模式

痴心易碎 提交于 2020-02-28 19:51:24
这篇文章中我会用8种写法来对单例模式进行优化,以达到最完美的效果 但是说实话在平常我们进行代码编写的时候用不着那么完美 单例模式 什么是单例模式? 简单的说就是只能new出来一个实例 第一种写法 饿汉式:   优点:简单实用   缺点:不论该对象是否会被用到,都提前将对象实例化 1.首先我们创建出一个静态的不可更改的变量Instance 2.我们将该类的构造方法的权限设置为private,防止其他类new对象 3.设置该对象的get方法 1 /** 2 * 饿汉式 3 * 类加载到内存后,就实例化一个单例,JVM保证线程安全 4 * (JVM保证每一个class只会露到内存一次,那么static变量在class露到内存之后马上进行初始化,所以static变量也保证初始化这一次) 5 * 简单实用,推荐使用 6 * 唯一缺点:不管用到与否,类加载时就完成实例化 7 */ 8 public class Mgr01 { 9 private static final Mgr01 Instance = new Mgr01(); 10 11 private Mgr01(){} 12 13 public static Mgr01 getInstance(){return Instance;} 14 15 public static void main(String[] args) { 16 /*

单例模式的几种方式

拥有回忆 提交于 2020-02-28 07:30:54
单例模式的几种方式,通用一点来说,分为两种,懒加载和非懒加载 1非懒加载 package com.thread.ch1; /** * 不能懒加载 */ public class SingletonObject1 { public static final SingletonObject1 instance = new SingletonObject1(); private SingletonObject1() { } public SingletonObject1 getInstance() { return instance; } } 2 其他的几个版本都是围绕懒加载来搞的 package com.thread.ch1; /** *双重校验 懒加载 */ public class SingletonObject5 { private static volatile SingletonObject5 instance; private SingletonObject5() { } public static SingletonObject5 getInstance() { if (instance == null) { synchronized (SingletonObject5.class){ if(null == instance) instance = new

单例模式

对着背影说爱祢 提交于 2020-02-28 07:06:38
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找 设计模式学习笔记汇总地址 1. 使用单例模式的原因 以Windows任务管理器为例,在Windows系统中,任务管理器是唯一的,多次打开任务管理器,始终只能弹出一个唯一的任务管理器. 这么做的理由有两个: 节约资源 避免多个实例数据不一致问题 1.1 节约资源 如果能弹出多个窗口,且这些窗口的内容完全一致,全部是重复对象, 这势必会浪费系统资源 ,任务管理器需要获取系统运行时的诸多信息,这些信息的获取需要消耗一定的系统资源,包括CPU资源及内存资源等,浪费是可耻的,而且根本没有必要显示多个内容完全相同的窗口 1.2 避免多个实例数据不一致问题 如果弹出的多个窗口内容不一致,问题就更加严重了,这意味着在某一瞬间系统资源使用情况和进程、服务等信息存在多个状态,例如任务管理器窗口A显示“CPU使用率”为10%,窗口B显示“CPU使用率”为15%,到底哪个才是真实的呢?这纯属“调戏”用户,给用户带来误解,更不可取. 为了确保对象的唯一性,我们可以通过单例模式来实现,这就是单例模式的动机所在 2. 单例模式概述 通过模拟Windows任务管理器,创建TaskManager类来理解单例模式 2.1 TaskManager /** * @author liuboren * @Title: 任务管理器类 *

设计模式-单例

纵饮孤独 提交于 2020-02-28 02:27:31
单例模式分为三种:1.饿汉模式,2.懒汉模式,3.登记模式 饿汉模式:在自己被加载时就将自己实例化,即便加载器是静态的 package singleton; public class EagerSingleton { private static final EagerSingleton eagerSingleton = new EagerSingleton(); private EagerSingleton(){} public static EagerSingleton getInstance() { return eagerSingleton; } } 懒汉模式:如果类加载器是静态的,那么懒汉式单例类被加载时不会将自己实例化 package singleton; public class LazySingleton { private static LazySingleton lazySingleton; private LazySingleton(){} public synchronized static LazySingleton getInstance() { if (lazySingleton == null) { lazySingleton = new LazySingleton(); } return lazySingleton; } } 登记模式

C#设计模式(1)——单例模式

有些话、适合烂在心里 提交于 2020-02-27 23:02:31
一、引言 最近在设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一反应应该就是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有一个实例,所以单例模式也就是 保证一个类只有一个实例的一种实现方法罢了(设计模式其实就是帮助我们解决实际开发过程中的方法, 该方法是为了降低对象之间的耦合度,然而解决方法有很多种,所以前人就总结了一些常用的解决方法为书籍,从而把这本书就称为设计模式) ,下面给出单例模式的一个官方定义: 确保一个类只有一个实例,并提供一个全局访问点。 为了帮助大家更好地理解单例模式,大家可以结合下面的类图来进行理解,以及后面也会剖析单例模式的实现思路: 三、为什么会有单例模式 看完单例模式的介绍,自然大家都会有这样一个疑问——为什么要有单例模式的?它在什么情况下使用的?从单例模式的定义中我们可以看出——单例模式的使用自然是当我们的系统中某个对象只需要一个实例的情况,例如:操作系统中只能有一个任务管理器,操作文件时,同一时间内只允许一个实例对其操作等

单例模式 饿汉与懒汉

耗尽温柔 提交于 2020-02-27 15:17:02
单例模式 就像任务管理器一样,只能由一个实例,你不能同时打开两个任务管理器,所以单例模式的对象不可以再外部通过new来创建,只能再类里通过 private static 来保证她的单例属性,再声明一个public函数来访问她。 ** 私有静态成员单例 + 私有单例构造函数 + 公有访问函数** 任务管理器例子 //由于每次使用new关键字来实例化TaskManager类时都将产生一个新对象, 为了确保 //TaskManager实例的唯一性, 我们需要禁止类的外部直接使用new来创建对象, 因此需要将 //TaskManager的构造函数的可见性改为private //构造函数改为private修饰后该如何创建对象呢? 不要着急, 虽然类的外部无法再使用new //来创建对象, 但是在TaskManager的内部还是可以创建的, 可见性只对类外有效。 因此, 我们 //可以在TaskManager中创建并保存这个唯一实例。 为了让外界可以访问这个唯一实例, 需要在 //TaskManager中定义一个静态的TaskManager类型的私有成员变量, //为了保证成员变量的封装性, 我们将TaskManager类型的tm对象的可见性设置为private, 但 //外界该如何使用该成员变量并何时实例化该成员变量呢? 答案是增加一个公有的静态方法, class TaskManager{

Golang设计模式-单例模式

為{幸葍}努か 提交于 2020-02-27 15:10:37
Golang单例模式实现 go语言做开始的必然是并发业务,所谓的单例模式也必须加锁否则会不断生成新的实例,不加锁的部分就不写了. 直接记录几个能用的到的单例模式,由浅入深. 懒汉加锁模式 package pattern import "sync" type singleton struct{} var instance *singleton var mu sync.Mutex //获取实例 func GetInstance() *singleton { //这种结构的单例模式,会导致每次都加锁,严重浪费性能 mu.Lock() defer mu.Unlock() if instance == nil { instance = &singleton{} } return instance } 懒汉双重锁检测模式 package pattern import "sync" //单例模式 type singleton struct{} var instance *singleton var mu sync.Mutex //获取实例 func GetInstance() *singleton { //不会导致每次都加锁,因为率先判断了随后才加的锁 //如果没有被实例化 if instance == nil { //加锁 mu.Lock() //实例化返回,并解锁 defer mu