欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java设计模式-单例模式【饿汉模式和懒汉模式异同点】

程序员文章站 2022-03-10 15:25:43
Singleton 单例模式(懒汉方式和饿汉方式)单例模式的概念:单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。关键点:1)一个类只有一个实例 , 这是最基本的2)它必须自行创建这个实例3)它必须自行向整个系统提供这个实例--------------------------------------------------------------------------两种实现方式:1 懒汉模...
Singleton 单例模式(懒汉方式和饿汉方式)
单例模式的概念:
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

关键点: 1)一个类只有一个实例 , 这是最基本的 2)它必须自行创建这个实例 3)它必须自行向整个系统提供这个实例 -------------------------------------------------------------------------- 两种实现方式: 1 懒汉模式(类加载时不初始化)
【懒----不先实例化(随用随时吃)------获取对象慢---考虑同步和非空,用的时候才实例化。】 package Singleton; public class LazySingleton { //懒汉式单例模式 //比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢 private static LazySingleton intance = null;//静态私用成员,没有初始化 private LazySingleton() { //私有构造函数 } public static synchronized LazySingleton getInstance() //静态,同步,公开访问点 { if(intance == null) { intance = new LazySingleton(); } return intance; } } 关键点:(代码注释上已给出) 1)构造函数定义为私有----不能在别的类中来获取该类的对象,只能在类自身中得到自己的对象 2)成员变量为static的,没有初始化----类加载快,但访问类的唯一实例慢,static保证在自身类中获取自身对象 3)公开访问点getInstance: publicsynchronized-----public保证对外公开,同步保证多线程时的正确性(因为类变量不是在加载时初始化的)

优缺点见代码注释。 2 饿汉式单例模式(在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快)
【饿------类加载时先实例化(怕吃的晚没得吃)-----获得对象快】 package Singleton; public class EagerSingleton { //饿汉单例模式 //在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快 private static EagerSingleton instance = new EagerSingleton();//静态私有成员,已初始化 private EagerSingleton() { //私有构造函数 } public static EagerSingleton getInstance() //静态,不用同步(类加载时已初始化,不会有多线程的问题) { return instance; } } 关键点:(代码注释已写) 1)私有构造函数 2)静态私有成员--在类加载时已初始化 3)公开访问点getInstance-----不需要同步,因为在类加载时已经初始化完毕,也不需要判断null,直接返回 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&7 单例设计模式

保证一个类在内存中只能有一个对象。

思路: 1)如果其他程序能够随意用 new 创建该类对象,那么就无法控制个数。因此,不让其他程序用 new 创建该类的对象。 2)既然不让其他程序 new 该类对象,那么该类在**自己内部**就要创建一个对象,否则该类就永远无法创建对象了。 3)该类将创建的对象**对外(整个系统)提供**,让其他程序获取并使用。

饿汉式:

一上来我就把对象给你 new 好了,你来了直接就可以拿去“吃”了

懒汉式

(要是有人问单例的延迟加载方式指的就是这种方式)

一开始我就不给你 new 对象,你来找我,我在给你创建一个对象

懒汉式有一个缺点,就是在多线程中使用的时候,可能会创建多个实例对象,比如,线程1来调用 getInstance() 方法,判断了 s==null,然后线程1由于未知的原因阻塞了,线程2再来调用 getInstance() 方法,判断 s==null ,线程2就创建了一个对象,这时候线程1又运行了,那么线程1就会创建一个对象~这样就会造成多个对象~ 懒汉式的线程优化——加一个同步锁

饿汉式和懒汉式的区别: 1)饿汉式是空间换时间,懒汉式是空间换时间。 2)在多线程访问的时候,懒汉式可能会创建多个对象,而饿汉式不会 

本文地址:https://blog.csdn.net/m0_45442261/article/details/108855331