首页 > 其他分享 >单例模式

单例模式

时间:2022-12-07 20:34:07浏览次数:42  
标签:Singleton singleton 模式 static 单例 public

单例模式

 一. 什么是单例模式
      有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计。
     
 二. 单例模式的特点
 ​
 1. 单例模式只能有一个实例。
 2. 单例类必须创建自己的唯一实例。
 3. 单例类必须向其他对象提供这一实例。

饱汉/懒汉模式

 饱汉/懒汉
 public class Singleton {
    //本类中定义本类的对象
    static Singleton singleton;
    private Singleton(){
    }
    //非static:使用对象调用
    //static: 可以通过类调用
    public static Singleton getInstance(){
        if(singleton==null){
            //第一次调用,成员变量没有初始化,分配空间
            singleton=new Singleton();
        }
        //返回成员变量
        return singleton;
    }
 }
 ​

饿汉模式

 饿汉
 public class Singleton {
    static Singleton singleton=new Singleton();
    private Singleton(){};
    public static Singleton getInstance(){
        return singleton;
    }
 }

区别

饱汉:加载类的时候不会分配空间,第一次调用分配空间

  懒加载

  优点:启动时不会占用过多资源

  缺点:第一个用户访问时候,响应慢,用户体验差。第一次惩罚

饿汉:加载类的时候就会分配空间

  这个是主流

  多线程环境,饿汉是安全,饱汉不安全

饱汉/懒汉模式加锁变安全

 public class Singleton {
    private static Singleton singleton;
    private Singleton(){}
 ​
    //double check 双重判断检查
    public static Singleton createInstance(){
        if (singleton==null){
            synchronized (SingletonRunnable.class){
                if (singleton==null){
                    singleton=new Singleton();
                }
            }
        }
        return singleton;
    }
 }

如何解决多线程不安全

synchronized 加锁关键字
1.加锁 synchronized 加在方法上面

2.同步代码块
多个线程,使用同一个锁对象
synchronized(锁对象){
//代码块
}

同步方法
public synchronized void sellTicket(){}
不想要指定锁对象,有默认的
非静态方法:就是this
静态方法:就是类的二进制字节码对象 对象.getClass() 类.class() 以后反射讲

标签:Singleton,singleton,模式,static,单例,public
From: https://www.cnblogs.com/huangjiangyang/p/16964457.html

相关文章

  • Seata TCC模式实战
    前言最近状态有点不好,所以创作动力不足,发觉日常生活一定要做减法,对少量的事保持持续专注的投入,养成良好的习惯。今天补充下,SeataTCC模式实战。一、TCC设计原则从TCC模型......
  • 还不会分布式事务,seata xa模式入门实战送上
    文章目录​​前言​​​​一、什么是seata?​​​​二、seata原理说明​​​​1、角色说明​​​​2、什么是Seata的事务模式?​​​​三、SEATA的分布式案例​​​​1、业......
  • 学习微服务你必须了解的设计模式
    前言这里的设计模式不同于我们熟悉的java程序面向对象的23种设计模式,解决方案的元素是类。而是一种更高层的设计模式,他们的解决方案由相互协作的服务构成。一、什么是模式语......
  • 模板方法模式
    豆浆制作问题 模板方法模式基本介绍模板方法模式原理类图  模板方法模式解决豆浆制作问题     代码演示packagecom.sky.template;/***抽......
  • 创建者模式
    建造者模式将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。分离了部件的构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂......
  • 为什么 egui 用立即模式?
    https://github.com/emilk/egui#why-immediate-mode 为什么立即模式egui是立即模式GUI库,与保留模式GUI库相对。保留模式和立即模式之间的区别最好用按钮的例子来说......
  • 01.单例设计模式
    单例设计模式​ 所谓单例设计模式,就是采取一定的方法在保证整个软件系统当中,对某个类只能存在一个对象实例,并且该类只提供了一个取得其对象实例的方法单例设计模式有八种......
  • 建造者模式(描述语言PHP)
    Builder模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说Builder模式中对象不是直接返回的。 <?php/***建造者模式**将一个复杂......
  • java单例模式
    1.饿汉式2.懒汉式2.1 双重检查2.2 静态内部类2.3 枚举......
  • FastBoot BootLoader Recovery 模式学习
    概念简单介绍fastboot是一种协议,是一种通过USB连接与bootloader通讯的机制。它被设计的非常容易实现,适用于Linux、Windows或者macOS等多种平台。fastboot是Android系统提......