[JAVAee]单例模式

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

目录

单例模式的含义

饿汉模式

注意事项

懒汉模式

单线程版本

多线程版本

多线程改进版本(推荐)

注意事项


单例模式的含义

解析这个名词:

单例中的单,指的是单个,一个的意思

而例,是实例的意思,实例也就是通常所说的对象.

合起来就是,只能有一个实例\对象的模式.

当然这是对于某一个类来说的.

在使用了这个模式后,我们就不能一直new一直new来创建多个对象了.会被这个模式下的java语法所限制,从而达到某个类只能含有一个类的情况.

单例模式的具体实现方法,对应的也分成饿汉模式懒汉模式和其他方法,这里着重介绍这两种.

饿汉模式

在创建类的时候顺手就把实例创建好(特点),并且把构造方法使用private修饰使用户在类外无法创建实例.达到有且只有一个实例的效果.

public static class Singleton{
        private static Singleton instance = new Singleton();//private修饰的且static
        private Singleton(){};
        public static Singleton getInstance(){//返回的类型为自定义类型
            return instance;
        }
    }

注意事项

类中创建的实例需要使用类名修饰,是一个自定义类型.

使用InputContext类下的类方法getInstance方法返回类中唯一的实例,使其可以在类外使用

③唯一的实例是需要被static修饰,原因是:

当在类外调用类方法的时候,可以通过创建一个新的实例通过这个新的实例调用其中的类方法.或者直接调用这个类的类方法(即静态方法).这一来就规定了,getInstance方法只有通过被static修饰在类外直接调用的这种方法.

而静态的方法,即类方法.是不可以访问非静态的实例或者变量的.这时候就需要我们把实例再加上static关键字,使其能够被返回

还要注意的是,为了达到唯一这个关键点.我们需要将其构造方法挂上private关键字来修饰,使其不能被在类外调用.

饿汉模式的特点为,在创建类的时候就已经把实例创建好了.不管后面的程序有没有使用到这个实例.

在多线程的模式下,是线程安全的.因为饿汉模式中只有读指令

懒汉模式

在getInstance方法中判断实例有无创建,如果第一个实例还没有创建则创建第一个实例.

能够放置后续代码没有使用这个实例,而却先前创建出来.浪费了空间资源

单线程版本

public static class Singleton1{
        private static Singleton1 instance = null;
        private Singleton1(){};
        public static Singleton1 getInstance(){
            if(instance == null){//在调用的时候才创建实例
                instance = new Singleton1();
            }
            return instance;
        }
    }

多线程版本

只是在单线程的基础上,加上synchronized关键字,对getinstance方法上锁

对getInstance方法上锁,防止多线程的环境下可能创建出多个实例的情况.

public static class Singleton2{
        private static Singleton2 instance = null;
        private Singleton2(){};
        public static synchronized Singleton2 getInstance(){//上锁
            if(instance == null){
                instance = new Singleton2();
            }
            return instance;
        }
    }

多线程改进版本(推荐)

在上面的基础上,将锁放到了内部.

对于单例模式的多线程下,会出现线程安全问题的只有实例需要被创建但还没创建出的情况.

将锁放到getinstance方法外面,再每次调用getinstance方法的时候都会进行上锁和销毁锁的操作.

可是锁的创建与销毁也是需要一定的开销的.

为了尽量避免这种开销,我们可以将锁放到里面.使用两个if语句来判断.外面的if通常适用于,实例已经创建后的状况下会使用次数比较多.而对于第二个if语句,只会在第一次创建实例的时候进入,

但在内部上锁,就会出现线程的内存可见性的问题,所以需要volatile关键字来修饰实例.

public static class Singleton3{
        private static volatile Singleton3 instance = null;
        private Singleton3(){};
        public static Singleton3 getInstance(){
            if(instance == null){
                synchronized (Singleton3.class){
                    if(instance == null){
                        instance = new Singleton3();
                    }
                }
            }
            return instance;
        }
    }

注意事项

①只有在类外调用getInstance方法的时候才创建实例,在一定程度上避免了资源的浪费

多线程环境下,饿汉模式并非天然就是线程安全的.因为其包含了读操作也包含有写操作.

多线程的环境下,使用饿汉模式最好使用改进后的版本.在合适的位置使用synchronized关键字上锁,并且使用volatile修饰实例.减少了上锁与销毁锁的次数,节约了资源,也有更高效的效率.文章来源地址https://www.toymoban.com/news/detail-606261.html

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

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

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

相关文章

  • 【JavaEE初阶】多线程(三)volatile wait notify关键字 单例模式

    摄影分享~~ 以上代码运行的结果可能是输入1后,t1这个线程并没有结束。而是一直在while中循环。而t2线程已经执行完了。 以上情况,就叫做 内存可见性问题 这里使用汇编来理解,大概分为两步操作: load,把内存中flag的值,读到寄存器中。 cmp,把寄存器中的值,和0进行比

    2023年04月25日
    浏览(42)
  • 【单例设计模式原理详解】Java/JS/Go/Python/TS不同语言实现

    单例模式(Singleton Pattern)属于创建型设计模式,这种模式只创建一个单一的类,保证一个类只有一个实例,并提供一个访问该实例的全局节点。 当您想控制实例数目,节省系统资源,并不想混用的时候,可以使用单例模式。单例有很多种实现方式,主要分为懒汉和饿汉模式

    2023年04月27日
    浏览(93)
  • Java单例模式详解--七种单例模式实现+单例安全+实际应用场景

    保证了一个类只有一个实例,并且提供了一个全局访问点。单例模式的主要作用是节省公共资源,方便控制,避免多个实例造成的问题。 实现单例模式的三点: 私有构造函数 私有静态变量维护对象实例 公有静态方法提供获取实例对象 七种单例模式实现 1.静态类:第一次运

    2024年02月04日
    浏览(62)
  • 【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式

    🍎 个人博客: 个人主页 🏆 个人专栏: JAVA ⛳️   功不唐捐,玉汝于成 目录 前言 正文 懒汉式(Lazy Initialization): 双重检查锁定(Double-Checked Locking): 结语 我的其他博客 在软件设计中,单例设计模式是一种重要的设计思想,它确保了一个类只有一个实例,并提供了一

    2024年01月15日
    浏览(55)
  • Java设计模式-单例模式

    单例模式是一种设计模式,它确保一个类只能创建一个实例,并提供一种全局访问这个实例的方式。在Java中,单例模式可以通过多种方式来实现,其中最常见的是使用私有构造函数和静态方法实现 在Java中,实现单例模式的方式有多种,其中最常见的实现方式包括以下几种:

    2024年02月01日
    浏览(46)
  • 【java】设计模式——单例模式

    单例模式要点 : 一个类只需要一个实例化对象; 必须自行创建实例; 必须自行向整个系统提供这个实例 实现 : 只提供 私有 构造方法; 有一个该类的 静态 私有对象; 提供一个静态 公有 方法用于创建、获取静态私有对象; 分析: 私有构造方法-不能随意创建实例; 静态

    2024年02月13日
    浏览(47)
  • JAVA设计模式——单例模式

    单例模式是应用最广的设计模式之一,也是程序员最熟悉的一个设计模式,使用单例模式的类必须保证只能有创建一个对象。 今天主要是回顾一下单例模式,主要是想搞懂以下几个问题 为什么要使用单例? 如何实现一个单例? 单例存在哪些问题? 单例对象的作用域的范围

    2024年02月16日
    浏览(44)
  • Java 设计模式——单例模式

    (1)单例模式 (Singleton Pattern) 是 Java 中最简单的设计模式之一。它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的

    2024年02月13日
    浏览(61)
  • Java设计模式【单例模式】

    单例模式(Singleton Pattern)是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供对该实例的唯一访问点。 优点 : 提供了对唯一实例的受控访问。 由于在系统内存中只存在一个对象,因此可以节约系统资源。 缺点 : 单例类的扩展有很大的困难。 单例类的

    2024年02月04日
    浏览(62)
  • Java基础:单例模式,Spring源码中有哪些单例模式

    单例模式是一种常用的软件设计模式,其目的是确保一个类仅有一个实例,并提供一个全局访问点来获取这个唯一实例。在Java中,实现单例模式通常需要遵循以下几个关键原则: 私有化构造器 :将类的构造器声明为 private ,以防止外部代码通过 new 操作符直接创建该类的实

    2024年04月23日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包