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

1.单例模式

时间:2023-08-15 17:24:47浏览次数:44  
标签:private instance 实例 线程 模式 单例 static public

单例模式

  • 定义:程序运行时,在java虚拟机中只存在该类的一个实例对象。
  • demo:
package mode;

public class SingleDemo {
    // 创建SingleDemo单例对象
    private static SingleDemo instance = new SingleDemo();
    // 将构造方法设成私有的,这样该类就不会被实例化
    private SingleDemo() {}

    public static SingleDemo getInstance() {
        return instance;
    }

    public void showMessage() {
        System.out.println("这里是重要的信息");
    }
}
class SingleAply{
    public static void main(String[] args) {
        SingleDemo singleDemo = SingleDemo.getInstance();
        singleDemo.showMessage();
    }
}

实现方式

懒汉式-线程不安全

懒汉式_线程不安全
优点 1.起到了延迟加载的效果
缺点 1.只能在单线程下使用
2.如果在多线程下,一个线程进入了if(single==null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这是便会产生多个实例。所以多线程不可以使用
结论 在实际开发中,不要使用这种方式
public class LazyNotSafe {
    private static LazyNotSafe instance;
    private LazyNotSafe() {}

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

懒汉式-线程安全

懒汉式_线程安全
优点 1.解决了线程不安全问题
缺点 1.效率太低,每个线程在想获得类的实例的时候,执行getInstance()方法都要进行同步。
2.而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例,直接return就行了。方法进行同步效率太低。
结论 在实际开发中,不要使用这种方式
public class LazySafe {
    private static LazySafe instance;
    private LazySafe() {}

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

懒汉式-线程不安全同步代码块

懒汉式_同步代码块
优点 延迟加载
缺点 1.本意是对线程安全的懒汉式进行改进,因为其同步方法效率太低,改为同步产生的实例化代码块
2.线程不能同步。假如一个线程进入了if(instance==null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例
注意:synchronized同步代码块中,当释放锁后,会继续向下执行
结论 在实际开发中,不能用这种方式
public class LazyNoSafePiece {
    private static LazyNoSafePiece instance;
    private LazyNoSafePiece() {}

    public LazyNoSafePiece getInstance() {
        if (instance == null) {
            synchronized(LazyNoSafePiece.class) {
                instance = new LazyNoSafePiece();
            }
        }
        return instance;
    }
}

饿汉式-静态变量/静态代码块

饿汉式_静态变量/静态代码块
优点 在类加载的时候完成了实例化,避免了线程同步问题。
缺点 在类装载的时候就完成实例化,没有达到延迟加载的效果。如果从头到尾未使用过这个实例,则会造成内存的浪费
结论 这种单例模式可以使用,但可能会造成内存的浪费
class HungrySafe {
    private static HungrySafe instance = new HungrySafe();
    private HungrySafe() {}
    public static HungrySafe getInstance() {
        return instance;
    }
}

class HungrySafe2 {
    private static HungrySafe2 instance;
    private HungrySafe2() {}
    static {
        instance = new HungrySafe2();
    }
    public static HungrySafe2 getInstance() {
        return instance;
    }
}

双重检查(推荐使用)

双重检查
优点 1.线程安全
2.延迟加载
3.效率较高
4.实例化代码只用执行一次,后面再次访问时,判断第一层if(xxx==null),直接return实例化对象,也避免的反复进行方法同步。
结论 在实际开发中,推荐使用
public class DoubleCheck {
    private DoubleCheck doubleCheck;
    private DoubleCheck() {}
    
    public DoubleCheck getInstance() {
        if (doubleCheck == null) {
            synchronized(DoubleCheck.class) {
                if (doubleCheck == null) {
                    doubleCheck = new DoubleCheck();
                }
            }
        }
        return doubleCheck;
    }
}

静态内部类(推荐使用)

优势
如何保证实例时只有一个线程?
即如何保证线程安全?
类的静态属性只会在第一次加载类的时候初始化,在类进行初始化时,别的线程是无法进入的,所以线程安全
如何实现延迟加载 利用静态内部类,不是在xxx类被装载时立即实例化,而是在调用getInstance方法时,才会装载xxx类,从而完成xxx类的实例化
public class InnerClass {
    // volatile:一有修改就更新到主存中去
    private static volatile InnerClass instance;
    private InnerClass() {}

    private static class InnerInstance {
        private final static InnerClass instance = new InnerClass();
    }

    public static InnerClass getInstance() {
        return InnerInstance.instance;
    }
}

枚举

标签:private,instance,实例,线程,模式,单例,static,public
From: https://www.cnblogs.com/jsqup/p/17630674.html

相关文章

  • 工厂方法模式练习:工厂方法模式在农场系统中的实现(IDEA)
    前言简单工厂模式和工厂模式的区别 简单工厂模式:也叫做静态工厂模式,可创建多个实现类,简单工厂模式实现了创建实现类的代码跟客户端分离,在工厂类里面可以添加所需生成实现类的逻辑; 缺点是每次增加一种实现类,都需要修改工厂类,不符合开闭原则;上期我发了一篇简单工厂模式练习......
  • 设计模式-工厂模式
    工厂模式(文章目录)什么是工厂模式  工厂模式,顾名思义,就是将对象的创建看作一个工厂,你告诉工厂需要的实例类型,工厂给你对象实例。  一般情况下,工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂。不过,在GoF的《设计模式》一书中,它将简单工厂模式看作是工厂......
  • C/C++基础知识点——设计原则及设计模式
    如何实现模块间高内聚、低耦合?封装与抽象;添加中间层;模块化;设计思想与原则单一职责;接口隔离原则;依赖倒置;迪米特原则;多用组合少用继承;设计模式:观察者模式设计原则及设计模式六大设计原则:单一职责原则;里氏替换原则;开闭原则;依赖倒置原则;接口隔离原则;最少知识原则。......
  • SAP CRM One Order 锁定模式用的是 Exclusive Lock
    在SAPCRMWebClientUI上点击Edit按钮后,界面进入可编辑状态:后台SM12事务码观察到锁类型为E,即Exclusivelock,也就是排他锁。其中PRCD_HEAD是Pricing模块抬头级别的数据:CRMOneOrder对应的lockobject名称为:E_CRM_ORDER关于这个叫做prospect的必填字......
  • 【设计模式之禅】单一职责
    最近前辈推荐我读《设计模式之禅》这本书,原因是我写的代码质量实在是一言难尽,开发速度很快,但是bug数就很多了,设计原则这种知识就需要掌握写这篇文主要是记录自己的学习以及督促自己第一章【单一职责】从我理解的层面来谈谈单一原则:明确每个类每个方法的任务,只做一......
  • 设计模式的六大原则
    开放封闭原则(OpenClosePrinciple)对外扩展是开放的,对内修改是封闭的,目的是保证程序的可扩展性以及可维护性 里氏代换原则(LiskovSubstitutionPrinciple)子类可以扩展父类的功能,但不能改变父类原有的功能。规定了子类不得重写父类的普通方法,只能重写父类的抽象方法,如果在设......
  • 设计模式--策略模式
    简介策略模式是一种行为设计模式,它将一组行为转换为对象,并使其在原始上下文对象内部能够相互替换原始对象被称为上下文,它包含指向策略对象的引用并将执行行为的任务分派给策略对象组成策略接口(Strategy):所有具体策略的通用接口,它声明了一个上下文用于执行策略的方法具体......
  • 设计模式大全:覆盖各类场景的实用模式与结构图
    设计模式大全:覆盖各类场景的实用模式与结构图目录设计模式大全:覆盖各类场景的实用模式与结构图1、设计模式六大原则(SOLID)2、设计模式分类及适用场景3、GOF经典设计模式及其结构图3-1、创建型1)工厂模式-FactoryPattern2)抽象工厂模式-AbstractFactoryPattern3)单例模式-Singleton......
  • 突破瓶颈:能源服务商的EMC模式
     ##01.什么是合同能源管理?合同能源管理(EMC-EnergyManagementContract) 是一种新型的市场化节能机制,其实质就是以减少的能源费用来支付节能项目全部成本的节能投资方式。:节能服务公司与用能单位以契约形式约定节能项目的节能目标,节能服务公司为实现节能目标向用能单位提......
  • 如何用Spring 原生注解 快速实现策略模式+工厂模式
    前言这阵子在做项目组重构的工作,工作中的一部分就是就目前代码库中与企业交互的逻辑抽离出来,单独做一个微服务,实现企业交互逻辑的关注点分离。在这里面我很自然而然的就用到了策略模式+工厂模式的方式,包装内部实现细节,向外提供统一的调用方式,有效的减少if/else的业务代码,使......