首页 > 其他分享 >框架升级之单例模式及统一异常处理

框架升级之单例模式及统一异常处理

时间:2024-07-29 17:25:24浏览次数:11  
标签:Singleton 框架 private 升级 instance 线程 单例 static public

单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,它的主要目的是确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例。单例模式在很多场景下都非常有用,比如配置文件读取、数据库连接、线程池等。

使用单例模式改造数据库连接功能

1.加载配置数据

数据库配置信息存储于database.properties配置文件中,具体配置信息如下所示

BaseDao类中的Init()方法负责从database.properties配置文件中加载配置信息

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/store?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username=root
password=123456
2.获取数据库的连接对象

使用Connetion getConnection()方法获取数据连接,返回Connection实例

3.处理查询操作

ResultSet execute(Connection,PreparedStatement,ResultSet,String,Object[])方法:负责根据传入的参数完成数据的查询操作,返回结果集ResultSet

4.处理增、删、改操作

使用 int execute(Connection,PreparedStatement,String,Object[])方法根据传入的参数完成数据的更新(增、删、改)操作,返回影响的行数

5.关闭数据库连接

使用 boolean closeResource(Connection,PreparedStatement,ResultSet)方法,负责根据传入的参数进行相应资源的关闭操作,返回boolean值

实现单例模式的几种方式

1. 懒汉式(线程不安全)

这种方式在类内部声明一个静态对象,在第一次使用时进行实例化。但是,这种实现方式在多线程环境下是不安全的,因为可能同时有多个线程尝试创建实例。

public class Singleton {  
    private static Singleton instance;  
  
    private Singleton() {}  
  
    public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}
2. 懒汉式(线程安全)

为了解决懒汉式在多线程环境下的安全问题,可以通过在getInstance()方法上添加synchronized关键字来实现线程安全,但这样会导致性能下降。

public class Singleton {  
    private static Singleton instance;  
  
    private Singleton() {}  
  
    public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}
3. 双重检查锁定(Double-Checked Locking)

双重检查锁定模式既实现了延迟加载,又保证了线程安全,同时避免了synchronized带来的性能问题。

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

注意:这里的volatile关键字非常关键,它确保了在多线程环境下instance变量的可见性,即一个线程修改了instance变量的值,其他线程能够立即得知这个修改。

4. 饿汉式

饿汉式在类加载时就完成了初始化,所以它是线程安全的。但是,这种方式无法做到延迟加载。

public class Singleton {  
    private static final Singleton instance = new Singleton();  
  
    private Singleton() {}  
  
    public static Singleton getInstance() {  
        return instance;  
    }  
}
5. 静态内部类

静态内部类方式既实现了延迟加载,又保证了线程安全,同时避免了使用volatile关键字。

public class Singleton {  
    private Singleton() {}  
  
    private static class SingletonHolder {  
        private static final Singleton INSTANCE = new Singleton();  
    }  
  
    public static final Singleton getInstance() {  
        return SingletonHolder.INSTANCE;  
    }  
}

这种方式利用了classloder的机制来保证初始化instance时只有一个线程,因此是线程安全的,同时它避免了在Singleton类加载时就初始化instance,达到了延迟加载的效果。

标签:Singleton,框架,private,升级,instance,线程,单例,static,public
From: https://blog.csdn.net/2401_82806976/article/details/140735255

相关文章

  • Java中的数据流处理框架:Apache Flink
    Java中的数据流处理框架:ApacheFlink大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨一下Java中的数据流处理框架——ApacheFlink。Flink是一款用于处理数据流和批处理的分布式处理框架。它具有高吞吐量、低延迟和容错的特性,广泛应用于实时......
  • 【论文解读】MetaGPT:用于元编程的多代理协作框架
    摘要基于大语言模型的多代理系统在解决自动化问题获得了显著进展。现有的基于大语言模型的多智能体系统已经可以解决简单的对话任务,但是对于更复杂的任务则因链式使用LLM导致的级联幻觉而导致逻辑不一致,从而变得复杂。在此,我们介绍MetaGPT,这是一种创新的元编程框架,将高效的......
  • [附开题]flask框架的校园疫情安全管理系统设计与实现tsckj(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景自新冠疫情全球爆发以来,校园作为高密度、高流动性的集体生活环境,其疫情防控工作面临着前所未有的挑战。学校师生众多,活动频繁,一旦发生疫情......
  • AM62x相比AM335x,到底升级了什么?
    Sitara作为TI处理器经典系列,曾推出众多优秀处理器型号(如AM335x)。因其能在相同价位下,提供比市面上其他厂商处理器更优良的性能,并凭借GPMC高速并口、PRU协处理器等个性化硬件资源,可提供更便利的拓展性,在工业控制、能源电力、轨道交通、智慧医疗等领域广受用户欢迎。如今AM335x作......
  • T3/A40i支持Linux-5.10新内核啦,Docker、Qt、Python统统升级!
    自2021年创龙科技推出全志国产化率100%的T3/A40i工业核心板后,不到两年时间已超过800家工业客户选择创龙科技T3/A40i平台。随着客户产品的不断升级与迭代,部分“能源电力”、“工业自动化”行业客户对T3/A40i的Linux版本提出了更高要求,主要涉及Docker、Qt、Python等组件特性。秉持......
  • Css为例 Hugo博客框架编译时将Assets中未实际使用的文件引入Public
    今日作Hugo博客开发的过程中,想使用main.css作为其他css的入口,即项目仅引用main.css,子样式模块在main.css中引入。编译后发现public中仅有main.css,没有其他的css文件导致样式无法正常使用。遂寻找解决办法:在项目仅实际引用main.css的情况下,将其他css文件导入public。解决办法为引......
  • Gin框架深度解析:构建高性能Go Web应用的基石
    Gin框架深度解析:构建高性能GoWeb应用的基石在当今的Web开发领域,选择一个合适的框架对于项目的成功至关重要。Gin,作为一款用Go(Golang)语言编写的Web框架,凭借其高性能、简洁的API设计以及丰富的特性,迅速在开发者社区中崭露头角。本文将深入解析Gin框架,从其核心特性、工作原理......
  • 报表控件DevExpress Reporting v24.1 - 全新升级报表查看器功能
    DevExpressReporting是.NETFramework下功能完善的报表平台,它附带了易于使用的VisualStudio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。DevExpressReporting控件日前正式发布了v24.1,新版本重点针对报表查看器的一系列功能进行......
  • 降碳目标,从【电梯节能】出发,电梯修理升级(节能率15%-45%)
    一、当前背景响应国家“双碳”国策,力争2030年前二氧化碳排放达到峰值,努力争取2060年前实现碳中和。中国将实现碳达峰的倒逼机制与绿色工业革命,节能将是我国实现“碳中和”目标最重要、最经济的手段。每节省1度电,就相当于0.785公斤碳排放量。碳排放权,2021年7月8日,生态环境......
  • Go: Gin框架中的binding验证器使用指南
    Go:Gin框架中的binding验证器使用指南原创 王义杰 AI学者王义杰  2024年05月30日22:33 广东 听全文在Gin框架中,数据绑定和验证是开发API时不可或缺的部分。Gin提供了强大的binding功能,允许我们将请求的数据绑定到结构体,并通过标签进行数据验证。本文将详细讲解如......