尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

八股整理xdsm - 教程

八股整理xdsm - 教程
📅 发布时间:2026/6/19 17:04:56

1.实现线程安全的单例模式

一、第一次检查:​​避免不必要的同步(提高性能)​

  • ​​目的​​:在​​大多数情况下,实例已经被创建了​​,我们​​不希望每次调用 getInstance()都进入同步块​​,因为同步(即 synchronized)是有性能开销的。

  • 如果 ​​instance 已经不为 null​​,说明单例已经创建,那么​​直接返回即可,不需进入 synchronized 块​​,避免了线程排队等待锁,提升了性能。

二、第二次检查:​​确保单例只被创建一次(线程安全

  • 进入 synchronized 块的线程可能有多个(在第一次检查都发现 instance == null 的情况下)。

  • ​​第一个进入同步块的线程​​会创建实例,但​​后面其他线程可能在等待锁释放后,也进入同步块​​。

  • 如果​​没有第二次检查​​,这些线程会​​再次创建新的实例​​,导致单例模式失效。

​​双重检查锁(Double-Checked Locking, DCL)​​ 实现线程安全的​​懒汉式单例模式​​

public class Singleton {
// volatile 保证可见性与禁止指令重排
private static volatile Singleton instance;

private Singleton() {}

public static Singleton getInstance() {
if (instance == null) { // 第一次检查,避免不必要的同步
synchronized (Singleton.class) { // 加锁,保证线程安全
if (instance == null) { // 第二次检查,确保只创建一次
instance = new Singleton();
}
}
}
return instance;
}
}

2.怎样自定义一个类加载器

先复习一下类加载器的关键方法:

核心方法:

  • ​​ClassLoader.loadClass(String name)​​

    • 加载指定类名的类,​​默认实现遵循双亲委派机制​​。

    • 该途径内部会先委派给父类加载器,父类加载不了才自己尝试加载。

  • ​​ClassLoader.findClass(String name)​​

    • ​​真正去查找并定义一个类​​的方法,​​默认实现是抛出 ClassNotFoundException​​。

    • ​​自定义类加载器通常重写该方法!​​

  • ​​ClassLoader.defineClass(byte[] b, int off, int len)​​

    • ​​将字节数组(.class 材料的内容)转换为 Class 对象​​,这是 JVM 提供的一个 native 途径,​​一般由 findClass 调用​​。

步骤 1:继承 ClassLoader类

通常你只需要继承 ClassLoader(或者 URLClassLoader,如果你想基于路径/URL 加载),然后​​重写 findClass(String name)方法​

步骤 2:实现 findClass方法

在这个方法中,你要求:

  1. ​​根据类名,找到对应的 .class 材料(或字节码来源:文件、网络、内存、加密文件等)​​

  2. ​​读取该文件的字节码(byte[])​​

  3. ​​调用 defineClass(name, byte[], offset, length)方法,将字节数组转为 Class 对象​

3.SPI

SPI(Service Provider Interface,服务提供者接口)​​ 是 Java 提供的一种​​服务发现机制​​,它定义了一种 ​​“接口与建立相分离”​​ 的规范,允许 ​​第三方为某个接口提供具体实现​​,并在运行时​​动态地被发现和加载​​。

JDBC 是 SPI 的典型应用场景

1. JDBC 定义了一个标准接口

java.sql.Driver

这是由 ​​JDK 提供的接口​​,它定义了连接数据库的标准方法,比如 connect()。

但它并没有提供具体实现,比如连接 MySQL、Oracle 的代码。

2. 各数据库厂商提供构建:

比如:

  • MySQL 提供了 com.mysql.cj.jdbc.Driver

  • Oracle 提供了 oracle.jdbc.driver.OracleDriver

这些类,就是 ​​SPI 的服务提供者实现(Service Provider)​​。

3. 但这些实现类不是由我们手动去 new 的,而是通过 ​​SPI 机制自动发现和加载的!​​

关键点在于:​​MySQL 的 jar 包中有一个文件:​

​META-INF/services/java.sql.Driver

档案中就写了

com.mysql.cj.jdbc.Driver

它就告诉 JVM:“如果你想找一个 java.sql.Driver的实现,可以加载我这个类”。

​​Java 在运行时通过 ServiceLoader找到这个配置,自动加载并实例化该驱动

相关新闻

  • US$98 Yanhua Mini ACDP Module4 BMW 35080, 35160DO WT EEPROM Read Write
  • US$98 Yanhua Mini ACDP Module4 BMW 35080, 35160DO WT EEPROM Read Write
  • 深入解析:K8s学习笔记(二) Pod入门与实战

最新新闻

  • SAP BOM查询实战:从正查到反查的完整指南
  • 【2026年6月】热水离心泵厂家推荐指南 - 多才菠萝
  • Python图片压缩方法全解:从入门到进阶
  • 【JAVA毕设源码分享】基于SpringBoot的中华传统文化网站(程序+文档+代码讲解+一条龙定制)
  • 全国学历提升继续教育学习体验实录
  • 验证码绕过实战:从Pikachu靶场剖析客户端与服务端漏洞原理

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号