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: public和synchronized的-----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