• java 单例模式


     

    单列设计模式:
    所谓的单列设计模式,就是采取一定的方法,保证整数软件系统中,只能存在一个对象实例。

     

    特点:

    1. 单例类只能有一个实例

    2.单例列必须自己创建自己的唯一实例

    3.单例类必须给所有其他对象提供这一实例

     

     

     

    饿汉式单例模式

    1. // 如何实现?:
    2. public static void main(String[] args) {
    3. // 返回的就是bank1 对象 (返回两个唯一的对象)
    4. Bank bank1 = Bank.getInstance();
    5. Bank bank2 = Bank.getInstance();
    6. System.out.println(bank1 == bank2); // 返回true(地址值是一样的);
    7. // Bank instance = Bank.getInstance();
    8. }
    9. }
    10. // 银行类: 单例 (饿汉式单例模式)
    11. class Bank {
    12. // 1. 私有化类 的构造器,为了避免,除Bank类的外面调用构造器,(即实例化对象)
    13. private Bank(){
    14. }
    15. // 2.内部 创建类的对象 (外面除了,Bank类以外实例化不了对象,只能在内部)
    16. // 要求此对象,也必须声明为静态的
    17. private static Bank instance = new Bank(); // (静态的)
    18. // 3,提供公共的静态方法,返回类的对象,静态的方法中只能调用静态的结构
    19. // 如果这里不是静态方法,是一般方法,外部类中的得创建Bank类的实例化对象,这样就可以调用getInstance方法,返回一个对象
    20. public static Bank getInstance(){ //(静态的)
    21. return instance;
    22. }
    23. }

     

     

     

    懒汉式单例模式:

     

    1. public class SingletonTest2 {
    2. public static void main(String[] args) {
    3. //类名(要实例化的是哪个对象) 变量名(用来接收实例化对象)
    4. Order order1 = Order.getInstance();
    5. Order order2 = Order.getInstance();
    6. System.out.println(order1 == order2);// true
    7. }
    8. }
    9. class Order {
    10. //1.私有化类的构造器
    11. private Order(){
    12. }
    13. // 2. 先声明当前类的对象,没有初始化
    14. // 4. 此对象也必须声明为static的
    15. private static Order instance = null;
    16. // 3. 声明public、static的返回当前类对象的方法
    17. public static Order getInstance(){
    18. // 错误写法:
    19. // instance = new Order();
    20. // return instance;
    21. // 不加if 判断,每调用一下getInstance,就创建一个新的Order实例化对象
    22. if(instance == null){ // 如果没有实例化对象,就创建
    23. instance = new Order();
    24. }
    25. return instance;
    26. }
    27. }

     

    【区分】

    饿汉式:

     坏处:  对象加载时间过长

    好处: 线程安全的(不会存在多个线程抢一个资源之类的)

               

     

     

    懒汉式:   好处: 延迟对象创建

                 坏处:  不安全

    例子:  两个线程都去获取这个对象,首次调用为null(判断),线程就假设阻塞了一下 ,就在这个阻塞的时间之内,另外一个线程也去获取这个对象,此时判断还是null,等阻塞没有了,他们两个对象  就进入if里面的new,各自实例化了一个实例对象,这样不安全,比如出现多个人抢到了一张火车票。

     

     

    【应用场景】

     

    网页的计数器,应用程序的日志应用,数据库的连接池,项目中读取配置文件的类,

    任务管理器,回收站也是。

  • 相关阅读:
    4.5 使用Go Modules自定义模块
    零数科技受邀出席2019全球未来出行大会
    Spring简介说明
    [ Linux长征路第三篇 ] 权限理解
    用IO多路复用实现 nginx 静态资源代理(C/Java/Golang)
    多维时序 | MATLAB实现PSO-BiLSTM-Attention粒子群优化双向长短期记忆神经网络融合注意力机制的多变量时间序列预测
    @Scheduled实现复杂的corn表达式
    剑指YOLOv5改进主干RepViT系列: 最新重参数化结构|ICCV 2023 最新开源移动端网络架构 RepViT,1.3ms 延迟,速度贼快
    MySQL数据去重
    操作系统之调度算法
  • 原文地址:https://blog.csdn.net/qq_54250695/article/details/125867583