设计模式第一课-单例模式(懒汉模式和饿汉模式)

这篇具有很好参考价值的文章主要介绍了设计模式第一课-单例模式(懒汉模式和饿汉模式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

单例模式

个人理解:单例模式实际就是通过类加载的方式获取到一个对象,并且保证这个对象在使用中只有一个,不允许再次被创建

一、懒汉模式

1、懒汉模式的基础写法

代码解释:
(1)、编写LazySingleton类的时候,需要将成员属性设定为static,这样才会是类属性
(2)、重写构造方法,将其设置为private,这样就防止其他人在new这个对象了,防止该类被重复new

package com.example.sheji.singleton.v1;
public class LazySingletonTest {

    public static void main(String[] args) throws Exception {
        LazySingleton instance = LazySingleton.getInstance();
        LazySingleton instance1 = LazySingleton.getInstance();
        System.out.println(instance);
        System.out.println(instance1);
    }
}

class LazySingleton{

    private static LazySingleton instance;

    private LazySingleton(){

    }
    public static LazySingleton getInstance()  {
        if(instance == null){
            instance =  new LazySingleton();
        }
        return instance;
    }
}

执行结果:可以看到两个对象是一样的,懒汉模式已经基本实现。
但这样的写法在多线程环境下是有问题的!
设计模式第一课-单例模式(懒汉模式和饿汉模式),数据结构和算法,设计模式,单例模式
当我们改为多线程的方式执行就会出现问题,对象居然不一样了

public class LazySingletonTest {

    public static void main(String[] args) throws Exception {
        Thread thread1 = new Thread(() -> {
            LazySingleton instance = LazySingleton.getInstance();
            System.out.println(instance);
        });
        Thread thread2 = new Thread(() -> {
            LazySingleton instance = LazySingleton.getInstance();
            System.out.println(instance);
        });
        thread1.start();
        thread2.start();

    }
}

class LazySingleton{
    private static LazySingleton instance;
    private LazySingleton(){

    }
    public static LazySingleton getInstance()  {
        if(instance == null){
            instance =  new LazySingleton();
        }
        return instance;
    }
}

设计模式第一课-单例模式(懒汉模式和饿汉模式),数据结构和算法,设计模式,单例模式
但如果我们让其中一个线程睡眠200ms呢,会发现对象的值又一样了
设计模式第一课-单例模式(懒汉模式和饿汉模式),数据结构和算法,设计模式,单例模式
原因如下图,在两个线程都没有休眠的时候,因为执行太快,当第一个线程执行到if(instance == null)里面时,对象还没有new出来,第二个线程也执行到了,所以出现了这种情况
当让第二个线程休眠200ms的时候,第一个线程已经初始化好对象了,第二个线程就不需要初始化了
设计模式第一课-单例模式(懒汉模式和饿汉模式),数据结构和算法,设计模式,单例模式

2、懒汉模式的升级写法

解释:
(1)、加锁synchronized ,当对象为空时,只允许一个线程先执行,其他线程等待,可以保证对象只被初始化一次
(2)、volatile 关键字,是为了防止指令重排序,防止instance 还没有开辟空间时,先被赋值了

class LazySingleton{

    private static volatile LazySingleton instance;

    private LazySingleton(){

    }
    public static LazySingleton getInstance()  {

        if(instance == null){
            synchronized (LazySingleton.class){
                if(instance == null){
                    instance =  new LazySingleton();
                }
            }
        }
        return instance;
    }
}

测试结果:
设计模式第一课-单例模式(懒汉模式和饿汉模式),数据结构和算法,设计模式,单例模式

二、饿汉模式

public class HungrySingletionTest {
    public static void main(String[] args) {
//        HungrySingletion instance1 = HungrySingletion.getInstance();
//        HungrySingletion instance2 = HungrySingletion.getInstance();
//        System.out.println(instance2);
//        System.out.println(instance1);

        Thread thread = new Thread(() -> {
            HungrySingletion instance1 = HungrySingletion.getInstance();
            System.out.println(instance1);
        });
        Thread thread1 = new Thread(() -> {
            HungrySingletion instance2 = HungrySingletion.getInstance();
            System.out.println(instance2);
        });
        thread.start();
        thread1.start();
    }
}
class HungrySingletion{
    private static HungrySingletion instance = new HungrySingletion();
    private HungrySingletion(){
    }
    public static HungrySingletion getInstance() {
        return instance;
    }
}

执行结果:
设计模式第一课-单例模式(懒汉模式和饿汉模式),数据结构和算法,设计模式,单例模式
解释:因为饿汉模式是在利用jvm在加载过程就已经自动初始化好了,所以不论是否使用多线程,都是一个对象文章来源地址https://www.toymoban.com/news/detail-742879.html

到了这里,关于设计模式第一课-单例模式(懒汉模式和饿汉模式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 懒汉单例设计模式与饿汉单例设计模式

    单例模式即一个类确保只有一个对象,主要用于避免浪费内存 1 .饿汉单例设计模式 :拿到对象时,对象就早已经创建好了 写法: 把类的构造器私有 在类中自己创建一个对象,并赋值到一个变量 定义一个静态方法,返回自己创建的这个对象 2. 懒汉单例设计模式 :第一次拿到对象时

    2024年02月21日
    浏览(54)
  • 自学设计模式(类图、设计原则、单例模式 - 饿汉/懒汉)

    设计模式需要用到面向对象的三大特性——封装、继承、多态(同名函数具有不同的状态) UML类图 eg.—— 描述类之间的关系(设计程序之间画类图)  +: public; #: protected; -: private; 下划线: static 属性名:类型(=默认值) 方法和变量分开------- 虚函数斜体,纯虚函数在虚函数类

    2024年02月11日
    浏览(38)
  • 设计模式之单例模式(懒汉, 饿汉)

    单例模式是一种常用的软件设计模式, 该模式的主要目的是确保某一个类在内存中只能有一个实例对象, 通过单例模式的方法创建的类在当前进程中只有一个实例对象. 常见的单例模式有两种: 饿汉式, 这里的 “饿” 意义表述不够清晰, 用 “急” 来表述意义更加容易联想一些

    2024年02月22日
    浏览(49)
  • c++单例模式包括懒汉模式和饿汉模式(优劣势分析和改进方法)

    在整个软件的运行过程中,让整个类有且只有一个实例化对象存在于整个进程中。 是最简单的一个设计模式,然后再项目开发中也是使用最广的。 1.节省资源:再整个软件的运行过程中,只有一个实例化对象,不用重新分配新的堆空间。 2.数据的传递:由于单例只会创建一个

    2024年02月21日
    浏览(38)
  • 单例模式类设计|什么是饿汉模式和懒汉模式

    那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量干货博客汇总 https://blog.csdn.net/yu_cblog/category_12379430.html?spm=1001.2014.3001.5482 一个类只能创建一个对象,

    2024年02月16日
    浏览(41)
  • 设计模式——C++11实现单例模式(饿汉模式、懒汉模式),与单例的进程

    本文将介绍单例模式,使用C++11实现多个版本的单例模式,分析各自的优缺点。最后提及如何实现一个单例的进程。 单例模式属于创建型模式,提供了一种创建对象的方式。 单例模式确保一个类只有一个实例。通过一个类统一地访问这个实例。 思想:将构造函数设置为私有

    2024年02月09日
    浏览(48)
  • 24种设计模式之单例模式(饿汉式、懒汉式)

    单例模式( Singleton Pattern )是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。单例模式是创建型模式。单例模式在现实生活中应用也非常广泛,例如,总统,班主任等。J2EE标准中的ServletContext 、ServletContextConfig 等、Spring框架应用中的。 特点:构造方

    2024年02月07日
    浏览(43)
  • Java中单例(单态、原子)设计模式(饿汉式/懒汉式)

    先看文章目录,大致了解知识点结构,直接点击文章目录可以跳转到文章指定位置。 设计模式就是设计出来的固定问题的解决方法,描述了在软件设计过程中的一些不断重复发生的问题和解决方案。遇到类似问题的时候可以直接使用现成的模式方案。 ①单例模式中一个类只

    2024年02月04日
    浏览(40)
  • 【Java中23种设计模式-单例模式2--懒汉式2线程安全】

    加油,新时代打工人! 简单粗暴,学习Java设计模式。 23种设计模式定义介绍 Java中23种设计模式-单例模式 Java中23种设计模式-单例模式2–懒汉式线程不安全 通过运行结果看,两个线程的地址值是相同的,说明内存空间里,创建了一个对象。

    2024年02月20日
    浏览(43)
  • 单例设计模式精讲(饿汉式和懒汉式实现的重要方法)

    目录 什么叫做单例模式? 饿汉式和懒汉式的区别? 饿汉式-方式1(静态变量方式) 饿汉式-方式2(静态代码块方式) 懒汉式-方式1(线程不安全) 懒汉式-方式2(线程安全) 懒汉式-方式3(双重检查锁) 懒汉式-方式4(静态内部类方式) 什么叫做单例模式?         涉

    2024年02月12日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包