单例模式

单例模式的优缺点

蹲街弑〆低调 提交于 2019-12-18 09:50:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1、时间和空间 比较上面两种写法:懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。 饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断了,节省了运行时间。 2、线程安全 (1)从线程安全性上讲,不加同步的懒汉式是线程不安全的,比如,有两个线程,一个是线程A,一个是线程B,它们同时调用getInstance方法,那就可能导致并发问题。如下示例: 复制代码 public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } 复制代码 程序继续运行,两个线程都向前走了一步,如下: 复制代码 public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } 复制代码 (2)饿汉式是线程安全的,因为虚拟机保证只会装载一次

设计模式学习笔记之单例模式

随声附和 提交于 2019-12-17 18:14:58
什么是单例模式? 顾名思义,就是只有一个实例,也就是说一个应用程序中只有一个实例对象. 既然一个系统,一个应用程序中只有一个实例,那么也就说明了如果操作这一个对象,必然涉及到共享资源,涉及到资源分配问题,资源竞争等问题. 那么我们的应用场景是什么呢? 1. 网站的在线人数. 网站的在线人数在某一个时刻,所有人看到的是一样的, 是这个网站这个时刻,所有用户所共享的. 2. 池化技术. 比如数据库的连接池. 每个数据库的可支持的连接数量是有限,而且连接对象创建和销毁也是比较耗内存的. 通过一个统一的入口去控制,可以保证对数据库的压力在可控的范围内,同是也可以保证出具库连接的持续使用. 3. 配置中心. 一个应用程序针对通过一个配置文件的加载只需要加载一次即可,不需要多次加载. 其实以上只是一些常见的应用场景,当然单例模式的应用场景也远不止于此. 本文参考的博客地址为: https://www.cnblogs.com/mr-yang-localhost/p/9644417.html 参考的博客的写的很不错, 如果想了解更多,可以去看看这篇参考的博客 接下来我们来看一下常见的实现方式,以及其中的对比. 饿汉式,即直接初始化好,使用的时候直接调用即可. package com.cbl.design.singletondesign; public class HungrySingleton {

单例模式

放肆的年华 提交于 2019-12-17 17:27:45
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 单例模式:确保一个类只有一个实例,并提供一个全局访问点(head first设计模式)。 应用场景:对象需要被共同频繁使用的地方,如多个模块使用同一个数据源连接对象等等。 单例模式的组件: Singleton(需单实例的类,构造方法是私有化的) tip:目前单例模式实现的手段一般有五种: 1、饿汉方式:特点是线程安全,无法懒加载,反序列需要注意。 2、懒汉方式:特点是线程不安全,可以懒加载, 反序列需要注意。 3、双重校验懒汉方式(DCL):可以懒加载,线程安全,如果不加volatile禁止指令重排序的话可能会出问题, 反序列需要注意。 4、内部静态类方式:线程安全,调用效率高,可以延时加载,反序列需要注意,较推荐。 5、枚举类:线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用,但是可读性很差,不推荐。 单例模式组件示例: java.lang.Runtime(饿汉式) 具体代码请参考JDK源码,此处就不列举了。 单例模式总结: 单例类必定会有一个私有化的构造器。 单例类可以限制实例的个数,节省内存,尤其是频繁的创建和销毁实例。 可以避免对资源的多重占用。 来源: oschina 链接: https://my.oschina.net/u/3057088/blog/3144061

Java五种单例模式与线程安全

只愿长相守 提交于 2019-12-17 14:46:42
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 懒汉式 顾名思义,lazy loading(延迟加载,一说懒加载),在需要的时候才创建单例对象,而不是随着软件系统的运行或者当类被加载器加载的时候就创建。当单例类的创建或者单例对象的存在会消耗比较多的资源,常常采用lazy loading策略。这样做的一个明显好处是提高了软件系统的效率,节约内存资源。下面我们看看最简单的懒汉单例模式: 代码1-1 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Singleton { private static Singleton singleton = null ; //私有的、类型为Singleton自身的静态成员变量 //构造方法被设为私有,防止外部使用new来创建对象,破坏单例 private Singleton(){ System.out.println( "构造函数被调用" ); } //公有的静态方法,供外部调用来获取单例对象 public static Singleton getInstance(){ if (singleton == null ){ //第一次调用该方法时,创建对象。 singleton = new Singleton(); } return singleton; } }

Java学习之单例模式

与世无争的帅哥 提交于 2019-12-17 14:26:21
单例设计模式:解决一个类在内存中只存在一个对象 思想: 1.为了避免过多创建类的对象,禁止此类以外创建对象(构造方法私有化) 2.为了类可以被使用就必须创建此类对象,只好在本类中,创建对象 3.在此类中创建的对象,怎么给此类以外的使用,所已此类必须提供返回对象的一个方法 代码体现: 1.将构造函数私有化 2.在类中创建对象 3.提供一个方法用于获取此类对象 class Single { /** 方式一、饿汉式 开发建议使用 */ //1.将构造函数私有化 private Single(){} //2.在类中创建对象 private static Single s=new Single(); //3.提供一个方法用于获取此类对象 public static Single getInstance() { return s; } /** 方式二、懒汉式 */ private Single(){} private static Single s=null; //线程不安全 public static Single getInstance() { if(s==null) s=new Single(); return s; } //加同步(效率低) public static synchronized Single getInstance() { if(s==null) s=new

源码学习之设计模式(单例模式)

烂漫一生 提交于 2019-12-17 02:11:22
众所周知,单例模式分为饿汉式和懒汉式,昨天在看了《spring5核心原理与30个类手写实战》之后才知道饿汉式有很多种写法,分别适用于不同场景,避免反射,线程不安全问题。下面就各种场景、采用的方式及其优缺点介绍。 饿汉式 (绝对的线程安全) 代码示例 1.第一种写法 ( 定义即初始化) public class Singleton{ private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } } 第二种写法 (静态代码块) public class Singleton{ private static final Singleton instance = null; static { instance = new Singleton(); } private Singleton() {} public static Singleton getInstance() { return instance; } } 饿汉式基本上就这两种写法。在spring框架中IoC的 ApplicantsContext 就是使用的饿汉式单例,保证了全局只有一个

Java设计模式—单例模式

喜夏-厌秋 提交于 2019-12-16 10:48:15
单例模式 什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 为什么要用单例模式? **意图:**保证一个类仅有一个实例,并提供一个访问它的全局访问点。 **主要解决:**一个全局使用的类频繁地创建与销毁。 **何时使用:**当您想控制实例数目,节省系统资源的时候。 **如何解决:**判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 **关键代码:**构造函数是私有的。 应用实例: 1、一个班级只有一个班主任。 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。 优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例

5种单例模式

那年仲夏 提交于 2019-12-16 01:41:37
为什么要单例模式呢? 好处: 1.对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销。 2.由于new操作的次数减少,所以系统内存的使用评率也会降低,这将减少GC压力,缩短GC停顿时间。 单例模式有哪几种? 懒汉、恶汉、静态内部类、枚举和双重校验锁。 代码实现: https://www.iteye.com/blog/bijian1013-2012394 来源: CSDN 作者: leiwuluan 链接: https://blog.csdn.net/leiwuluan/article/details/103531327

Java单例模式的七种写法

被刻印的时光 ゝ 提交于 2019-12-15 19:31:38
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 public static Singleton getInstance() { 5 if (instance == null) { 6 instance = new Singleton(); 7 } 8 return instance; 9 } 10 } 11 这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。 第二种(懒汉,线程安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 public static synchronized Singleton getInstance() { 5 if (instance == null) { 6 instance = new Singleton(); 7 } 8 return instance; 9 } 10 } 11 这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy

设计模式--单例模式

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-15 04:47:38
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。 这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 1 介绍 意图 :保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决 :一个全局使用的类频繁地创建与销毁。 何时使用 :当您想控制实例数目,节省系统资源的时候。 如何解决 :判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 关键代码 :构造函数是私有的。 应用实例 : 1、一个班级只有一个班主任。 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。 优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。 缺点 :