关于Java中单例模式(饿汉模式和懒汉模式)的简析

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

目录

一.什么是单例模式

二.饿汉模式和懒汉模式

饿汉模式

代码

懒汉模式

代码

关于多线程安全的问题

如何解决懒汉模式多线程安全问题

双if判断


一.什么是单例模式

简单来说,就是我们在程序中通过代码进行限制,在该程序中

只能创建一个对象

二.饿汉模式和懒汉模式

因为只能创建一个对象,所以对于我们而言就有两种方式

第一种方式

饿汉模式

让程序自动类中创建唯一的对象

在类外不能被创建

代码

class Student{

//此处在类的内部一开始就自己创建了唯一的Student对象
    public static Student st = new Student();

//提供private构造方法,让其在类外不能被调用
    private Student(){}

//提供getInstance方法,以便获取唯一的Student对象
    public static Student getInstance(){
        return st;
    }
}
public class Main {
    public static void main(String[] args) {

//此处的st2,和st3都指向唯一的st对象,还是只存在唯一一个对象
        Student st2 = Student.getInstance();
        Student st3 = Student.getInstance();
    }
}

第二种方式

懒汉模式

就是程序在自己内部不创建唯一对象

而是我们需要的时候再在类外面new那个唯一的对象

这种方式就叫做懒汉模式

代码

class Teacher{

//将te指向空,等到get的时候再进行实例化,这里是没有指向任何对象
    private static Teacher te = null;

//避免通过new的方式创建其他实例,只能通过get方式获取唯一实例
    private Teacher(){}

//通过get创建唯一对象
    public static Teacher getInstance(){
        if(te == null){
            te  = new Teacher();
        }
        return te;
    }
}
public class demo1 {
    public static void main(String[] args) {

//调用才创建对象
        Teacher te1 = Teacher.getInstance();
    }
}

关于多线程安全的问题

其实我们大体上就要记住一点

多线程同时修改同一份变量大概率就会发生线程安全的问题

所以在上述代码中

我们的饿汉模式在多线程的情况下

他不管调用几次都只是在返回已经创建好的那个唯一对象

只是相当于获取

并没有进行任何修改操作

但是在懒汉模式的多线程下

我们是进行了判断,然后创建的唯一对象,创建这个操作就是对数据进行了修改

那么多个线程同时对一个数据进行修改,那么就会发生多线程安全的问题

所以

饿汉模式没有多线程安全问题

懒汉模式多线程安全问题

如何解决懒汉模式多线程安全问题

加锁

加锁

还是(* * *)加锁

我们最优先想到的就是直接在get方法那里加上synchronized

class Teacher{
    private static Teacher te = null;
    private Teacher(){}
//直接加上一把锁
    public static synchronized Teacher getInstance(){
        if(te == null){
            te  = new Teacher();
        }
        return te;
    }
}

但是这样是会有问题的

因为此处的操作并不是原子性,那么如果是多线程进行操作,可能会出现下面的情况关于Java中单例模式(饿汉模式和懒汉模式)的简析

 也就是说,我们可能会同时返回两个对象回去

为了避免这种情况,我们还需要加入关键字volatile(禁止指令重排序与保证可见性)

class Teacher{
//这里加上volatile 后就没有排序的问题了
    private static volatile Teacher te = null;
    private Teacher(){}
    public static synchronized Teacher getInstance(){
        if(te == null){
            te  = new Teacher();
        }
        return te;
    }
}

实际上到了这一步

我们已经解决安全的问题了

但是为了进一步提升效率,我们采取了双if判断的方式

双if判断

我们把锁加在了if判断语句这里,而取消了get方法的锁

让多个线程同时调用该方法,如果没有被创建,则执行上锁的new对象操作

如果已经被创建则返回该对象

class Teacher{
    private static volatile Teacher te = null;
    private Teacher(){}
    public static  Teacher getInstance(){

//第一个if判断,如果已经创建锁,就直接跳到最后的返回
        if(te == null){

//多个线程在调用get的时候,都卡在这里竞争这把锁
//竞争成功的创建唯一对象,并释放锁
//其他线程拿到被释放的锁之后进去查看,发现第一个线程已经创建了唯一对象
//不满足第二个if条件,又跳到最后返回
            synchronized(Teacher.class){
                if(te == null){
                    te  = new Teacher();
                }
            }
        }
        return te;
    }
}

但我个人感觉,用前面的volatile和对get方式加锁已经足够了

虽然效率比双if要低一些但已经解决了我们的多线程安全问题

双if判断只能说锦上添花吧文章来源地址https://www.toymoban.com/news/detail-497560.html

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

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

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

相关文章

  • Java单例模式的五种实现方式 懒汉式 饿汉式 双重校验锁 静态变量 静态内部类 枚举实现单例模式等

    Java单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例。它通常用于需要共享资源或控制某些共享状态的情况下。 懒汉式:在类加载的时候就创建对象,要再调用方法时才创建对象,减少内存开销。 饿汉式:再类加载的时候就实例化对

    2024年04月27日
    浏览(34)
  • 【单例模式】饿汉模式和懒汉模式的单例模式

    设计模式是一种 在软件设计中经过验证的解决问题的方案或者模版 。它们是从实践中总结出来的,可以帮助解决常见的设计问题,提高代码的重用性、维护性和扩展性。 设计模式可以分为三大类: 创建型模式(Creational Patterns) :创建型模式关注对象的实例化过程,包括如

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

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

    2024年02月22日
    浏览(49)
  • 单例模式(饿汉式单例 VS 懒汉式单例)

    所谓的单例模式就是保证某个类在程序中只有一个对象 1.构造方法私有化(保证对象的产生个数)         创建类的对象,要通过构造方法产生对象        构造方法若是public权限,对于类的外部,可以随意创建对象,无法控制对象个数       构造方法私有化,这样类的外

    2024年02月09日
    浏览(39)
  • 单例模式(懒汉式和饿汉式)

    单例模式是指保证某个类在整个软件系统中只有一个对象实例,并且该类仅提供一个返回其对象实例,由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。 在计算

    2024年02月13日
    浏览(47)
  • 单例模式:懒汉式和饿汉式

    目录 懒汉模式和饿汉模式 区别 示例 懒汉模式线程不安全 懒汉模式线程安全  懒汉模式内部静态变量线程安全 饿汉式线程安全 指的是在系统生命周期内,只产生一个实例。 分为 懒汉式 和 饿汉式 创建时机和线程安全 线程安全 :多线程共享资源的过程中,线程安全通过同

    2024年02月16日
    浏览(41)
  • JavaEE:单例模式(饿汉模式和懒汉模式)精讲

    前言 什么是单例模式? 其实用通俗的话就是程序猿约定俗成的一些东西,就比如如果你继承了一个抽象类,你就要重写里面的抽象方法,如果你实现了一个接口,你就要重写里面的方法。如果不进行重写,那么编译器就会报错。这其实就是一个规范。 而单例模式能保证某个

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

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

    2024年02月11日
    浏览(39)
  • 【多线程案例】单例模式(懒汉模式和饿汉模式)

    提起单例模式,就必须介绍设计模式,而设计模式就是在软件设计中,针对特殊问题提出的解决方案。它是多年来针对一些常见的问题的解决方法,具有良好的可复用性、可扩展性和可维护性。 标准的设计模式有23种,单例模式就是最常见的一种,其目的是确认一个类只有一

    2024年02月10日
    浏览(43)
  • 懒汉单例设计模式与饿汉单例设计模式

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

    2024年02月21日
    浏览(55)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包