面试官考我Object类中的所有方法及场景使用?我...

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java 知识点啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
🏆本文收录于「Java进阶实战」专栏,数多年Java开发老兵项目累计经验,专业攻坚指数级提升,助你一臂之力,早日实现财富自由🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
前几日,有位女读者遇到了一个很常见却又不好答的棘手面试题,于是特地向我诉苦了一波,于此,我怎么能见女不救,正所谓救人一命胜造七级浮屠。在此,我们就一起来再来温故一波对象的鼻祖Object类,及它的所有方法及使用场景吧。
解读Object类
在Java中,我们都知道,Object类是所有类的根类,它位于类层次结构的顶端。Object类提供了一些基本的方法,这些方法被继承到所有的类中。以下是Object类中定义的主要方法及其用法:
toString()
toString()- 返回对象的字符串表示,通常用于打印对象的简要信息。
Object obj = new Object();System.out.println(obj.toString());
默认实现会返回类名@哈希码,源码实现如下:

如上段代码是Java中用于生成对象的字符串表示形式的常见方法之一。它在默认情况下返回一个由类名和对象的哈希码组成的字符串,格式为类名@哈希码。
拓展一下:
getClass().getName()返回对象所属类的名称。Integer.toHexString(hashCode())将对象的哈希码转换为十六进制字符串表示。
因此,toString() 方法返回的字符串将类名和对象的哈希码连接在一起,以 @ 符号分隔。这样的字符串并不是特别有用,因为它不提供对象的实际内容信息,但是它可以用于快速检查对象的标识。
示例演示:

equals(Object obj)
equals(Object obj)- 用于比较两个对象是否相等。默认实现是比较对象的引用,即是否为同一个实例。
Object obj1 = new Object();Object obj2 = obj1;Object obj3 = new Object();System.out.println(obj1.equals(obj2)); // true,因为obj1和obj2是同一个对象System.out.println(obj1.equals(obj3)); // false,因为obj1和obj3是不同的对象
示例演示如下:

hashCode()
hashCode()- 返回对象的哈希码值,该值在equals方法中用于比较对象的相等性。默认实现返回对象的系统标识符。
例如:
Object obj = new Object();int hash = obj.hashCode();
示例演示:

getClass()
getClass()- 获取运行时对象的类信息,返回一个Class对象。
例如:
Object obj = new Object();Class<?> clazz = obj.getClass(); // 获取obj的运行时类类型
示例演示:

clone()
clone()- 创建并返回对象的一个副本。默认实现是浅拷贝,即复制对象的引用值,而不是实际的内容。
例如:
/*** @Author bug菌* @Source 公众号:猿圈奇妙屋* @Date 2024-04-02 19:02*/
public class testObject implements Cloneable{@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}public static void main(String[] args) {testObject obj = new testObject();try {testObject cloneObj = (testObject) obj.clone(); // 创建obj的一个浅拷贝System.out.println(cloneObj);} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}
示例演示:

拓展一下:
在Java中,要使用clone()方法,首先需要确保被克隆的对象的类实现了Cloneable接口。如果一个类没有实现Cloneable接口,调用其clone()方法会抛出CloneNotSupportedException异常。
另外,clone()这个方法使用了protected访问修饰符,因此只能在同一包内的类或者继承了这个类的子类中访问,因此只能在同一个包内或者子类中使用。

如果要克隆一个对象,最好的方式是通过实现Cloneable接口并重写clone()方法。示例代码如下:
class MyClass implements Cloneable {// 类的成员和方法@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
然后你可以这样使用:
MyClass obj = new MyClass();
MyClass cloneObj = (MyClass) obj.clone();
若你直接对Object类的实例调用了clone()方法,但是Object类并没有实现Cloneable接口,会抛出CloneNotSupportedException异常。
wait()
wait()- 使当前线程等待,直到另一个线程调用此对象的notify()或notifyAll()方法。
synchronized (obj) {try {obj.wait(); // 当前线程等待} catch (InterruptedException e) {e.printStackTrace();}}
示例这里我就先不着急给大家演示,同学们先看下我给大家解读的notify()方法学习后,我再一并给大家演示,毕竟这两是一起连用的,单独用没啥意义。
notify()
notify()- 唤醒在此对象上等待的单个线程(如果有的话)。
使用例如:
synchronized (obj) {obj.notify(); // 唤醒一个在此对象上等待的线程}
示例演示:
这里联合notify(),关于Object类中使用wait()及notify()方法的示例演示:
定义启动类,将演示wait()、notify()方法效果。
/*** @Author bug菌* @Source 公众号:猿圈奇妙屋* @Date 2024-04-02 19:38*/
public class WaitNotifyExample {public static void main(String[] args) {Message message = new Message();// 创建一个等待线程Thread waiterThread = new Thread(new Waiter(message));// 创建一个通知线程Thread notifierThread = new Thread(new Notifier(message));// 启动线程waiterThread.start();notifierThread.start();}
}
定义一个Message类,用于在线程之间传递消息
package com.example.javase.bugTest.objectDemo;/*** @Author bug菌* @Source 公众号:猿圈奇妙屋* @Date 2024-04-02 19:38*/
public class Message {private String content;public synchronized String getContent() {return content;}public synchronized void setContent(String content) {this.content = content;}
}
定义一个Waiter类,等待消息并打印。
/*** @Author bug菌* @Source 公众号:猿圈奇妙屋* @Date 2024-04-02 19:38*/
public class Waiter implements Runnable {private Message message;public Waiter(Message message) {this.message = message;}@Overridepublic void run() {synchronized (message) {try {System.out.println("Waiter 等待中...");// 调用wait()方法,等待被通知message.wait();} catch (InterruptedException e) {e.printStackTrace();}// 收到通知后打印消息System.out.println("Waiter 收到通知: " + message.getContent());}}
}
定义一个Notifier类,负责发送通知。
/*** @Author bug菌* @Source 公众号:猿圈奇妙屋* @Date 2024-04-02 19:38*/
// Notifier类负责发送通知
public class Notifier implements Runnable {private Message message;public Notifier(Message message) {this.message = message;}@Overridepublic void run() {synchronized (message) {// 设置消息内容message.setContent("你好,这是一条消息!");// 通知等待线程message.notify();System.out.println("Notifier 发送通知完毕");}}
}
其中这个示例包含了一个Message类用于在线程之间传递消息,一个Waiter类等待消息并打印,一个Notifier类负责发送通知。在Waiter类中,使用了wait()方法来使线程进入等待状态,直到收到Notifier类发送的通知才继续执行。
实际运行结果展示:

拓展一下:
如上示例演示了Object类中的wait()和notify()方法的使用,用于线程间的通信和同步。第一,我定义了一个Message类,它包含一个私有的字符串成员变量msg,以及一个getMessage()方法和setMessage()方法用于设置和获取消息。第二,定义了一个Waiter类和一个Notifier类,它们都实现了Runnable接口,用于作为线程执行体。Waiter类中的run()方法中调用了message.waitMessage()方法,而Notifier类中的run()方法中调用了message.setMessage()方法。第三,在WaitNotifyExample类的main()方法中,先创建了一个Message对象,并分别创建了一个等待线程waiterThread和一个通知线程notifierThread,它们都传入了同一个Message对象。最后,通过start()方法启动了这两个线程,实现了等待线程和通知线程的交互。
总的来说,为大家演示了如何使用wait()和notify()方法实现线程间的等待和通知机制,从而实现线程间的协作。不知道大家可否能及时掌握,有疑问的及时评论区告知于我。
notifyAll()
notifyAll()- 唤醒在此对象上等待的所有线程。
例如:
synchronized (obj) {obj.notifyAll(); // 唤醒所有在此对象上等待的线程}
示例演示:
1、定义一个MessageProducer类,实现Runnable 接口,定位为一个消息生产者,当执行它的 run() 方法时,它会将一个新消息设置到 message 对象中,并通知所有等待中的线程。
/*** @Author bug菌* @Source 公众号:猿圈奇妙屋* @Date 2024-04-02 19:51*/
public class MessageProducer implements Runnable {private Message message;public MessageProducer(Message message) {this.message = message;}@Overridepublic void run() {synchronized (message) {// 生产消息message.setContent("New message: Hello, world!");// 通知所有等待的线程message.notifyAll();}}
}
2、定义一个MessageConsumer类,实现Runnable 接口,定位为一个消息消费者,目的是实现一个等待消息并处理的逻辑,通过线程的等待和唤醒机制,确保消息在到达后能够及时被消费。
/*** @Author bug菌* @Source 公众号:猿圈奇妙屋* @Date 2024-04-02 19:51*/
public class MessageConsumer implements Runnable {private Message message;public MessageConsumer(Message message) {this.message = message;}@Overridepublic void run() {synchronized (message) {// 等待消息的到来while (message.getContent() == null) {try {// 等待消息通知message.wait();} catch (InterruptedException e) {e.printStackTrace();}}// 收到消息后进行处理System.out.println("Received message: " + message.getContent());}}
}
3、定义一个mian主函数,用于创建生产者和消费者线程,最后通过启动线程,达到生产者线程将消息放入 Message 对象中,而消费者线程则从 Message 对象中获取消息并进行处理的效果。
package com.example.javase.bugTest.objectDemo;/*** @Author bug菌* @Source 公众号:猿圈奇妙屋* @Date 2024-04-02 19:51*/
public class NotifyAllTest {public static void main(String[] args) {// 创建一个共享的消息对象Message message = new Message();// 创建生产者线程和消费者线程Thread producerThread = new Thread(new MessageProducer(message));Thread consumerThread1 = new Thread(new MessageConsumer(message));Thread consumerThread2 = new Thread(new MessageConsumer(message));// 启动线程producerThread.start();consumerThread1.start();consumerThread2.start();}
}
4、执行main函数本地测试结果如下:

很明显,结果符合预期,生产者将消息传递后且唤醒在此对象上等待的所有线程(所有消费者线程),消费者拿到消息后并进行了打印。
拓展一下:
如上示例演示了线程间如何通过共享对象进行通信。具体来说,创建了一个名为 NotifyAllTest 的公共类,其中包含一个名为 main 的静态方法。在 main 方法中:
- 创建了一个
Message对象,这是一个自定义的消息对象,用于在生产者和消费者线程之间传递消息。 - 创建了一个生产者线程 (
producerThread) 和两个消费者线程 (consumerThread1和consumerThread2)。 - 启动了这三个线程。
其中,MessageProducer 类和 MessageConsumer 类实现了 Runnable 接口,用于定义生产者和消费者线程的行为。生产者线程将消息放入 Message 对象中,而消费者线程则从 Message 对象中获取消息并进行处理。
这个示例,我给大家演示了下线程间的基本通信和协作机制,但需要注意的是,它并没有提供线程安全的保障。在实际应用中,可能需要采取额外的措施来确保多线程环境下的数据安全性。
finalize()
finalize()- 在垃圾收集器决定回收对象之前,由垃圾收集器调用此方法。这个 finalize 机制是不确定的,不保证会被调用,且在Java 9中已经被弃用。
简单使用实例例如:
protected void finalize() throws Throwable {super.finalize();// 清理资源的代码}
示例演示:
好的,下面是一个关于Object类使用finalize()方法的示例:
/*** @Author bug菌* @Source 公众号:猿圈奇妙屋* @Date 2024-04-02 20:08*/
public class FinalizeExample {// 定义一个类来演示finalize()方法static class MyObject {// 在对象销毁前调用finalize()方法@Overrideprotected void finalize() throws Throwable {try {// 执行清理资源的操作System.out.println("对象被销毁前执行finalize()方法");} finally {super.finalize();}}}public static void main(String[] args) {// 创建一个对象MyObject obj = new MyObject();// 将对象设为null,以便触发垃圾回收obj = null;// 强制垃圾回收System.gc();// 等待一段时间以确保finalize()方法被调用try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}
}
本地执行结果如下:

在这个示例中,我定义了一个包含finalize()方法的内部类MyObject。在该方法中,我们可以执行清理资源的操作。在主函数中,我创建了一个MyObject对象,并将其设为null以便触发垃圾回收。然后,我手动调用了System.gc()方法来强制进行垃圾回收。最后,通过让主线程休眠一段时间,等待finalize()方法被调用。
小结
大多数时候,你可能需要重写这些方法来提供特定的实现。例如,为了正确地比较两个对象是否相等,你可能需要重写equals和hashCode方法。同样,为了实现深拷贝,你可能需要重写clone方法。
请注意,Object类中的wait(), notify()和notifyAll()方法是同步控制的一部分,它们只能在对象的监视器(由synchronized关键字实现)被当前线程持有时调用。不当使用这些方法可能导致死锁或其他同步问题。
… …
ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看专栏《Java进阶实战》中的其他硬货,每篇都是实打实的项目实战经验所撰。只要你每天学习一个奇淫小知识,日积月累下去,你一定能成为别人眼中的大佬的!功不唐捐,久久为功!
「赠人玫瑰,手留余香」,咱们下期拜拜~~
☀️建议/推荐你
无论你是计算机专业的学生,还是对编程感兴趣的跨专业小白,都建议直接入手「滚雪球学Java」专栏;该专栏不仅免费,bug菌还郑重承诺,只要你学习此专栏,均能入门并理解Java SE,以全网最快速掌握Java语言,每章节源码均同步「Gitee」,你真值得拥有;学习就像滚雪球一样,越滚越大,带你指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同Java实战类型技术硬货,还可免费白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!
📣关于我
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 20w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

相关文章:
面试官考我Object类中的所有方法及场景使用?我...
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java 知识点啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯&a…...
Web前端精通教程:深入探索与实战指南
Web前端精通教程:深入探索与实战指南 在数字化时代,Web前端技术已经成为构建优秀用户体验的基石。想要精通Web前端,不仅需要掌握扎实的基础知识,还需要具备丰富的实战经验和深入的思考。本文将从四个方面、五个方面、六个方面和七…...
四轴飞行器、无人机(STM32、NRF24L01)
一、简介 此电路由STM32为主控芯片,NRF24L01、MPU6050为辅,当接受到信号时,处理对应的指令。 二、实物图 三、部分代码 void FlightPidControl(float dt) { volatile static uint8_t statusWAITING_1; switch(status) { case WAITING_1: //等待解锁 if…...
OpenAI Assistants API:如何使用代码或无需代码创建您自己的AI助手
Its now easier than ever to create your own AI Assistant that can handle a lot of computing tasks for you. See how you can get started with the OpenAI AI Assistant API. 现在比以往任何时候都更容易创建您自己的AI助手,它可以为您处理许多计算任务。了…...
CentOS7 配置Nginx域名HTTPS
Configuring Nginx with HTTPS on CentOS 7 involves similar steps to the ones for Ubuntu, but with some variations in package management and service control. Here’s a step-by-step guide for CentOS 7: Prerequisites Domain Name: “www.xxx.com”Nginx Install…...
C++入门8 构造函数析构函数顺序|拷贝构造
一,构造函数析构函数 调用顺序 我们先来看下面的代码: #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> using namespace std; class student { public:char my_name[20];int my_id;student(int a) {my_id a;co…...
【git使用四】git分支理解与操作(详解)
目录 (1)理解git分支 主分支(主线) 功能分支 主线和分支关系 将分支合并到主分支 快速合并 非快速合并 git代码管理流程 (2)理解git提交对象 提交对象与commitID Git如何保存数据 示例讲解 &a…...
【docker】如何解决artalk的跨域访问问题
今天折腾halo的时候,发现artalk出现跨域访问报错,内容如下。 Access to fetch at https://artk.musnow.top/api/stat from origin https://halo.musnow.top has been blocked by CORS policy: The Access-Control-Allow-Origin header contains multipl…...
MYSQL 索引下推 45讲
刘老师群里,看到一位小友 问<MYSQL 45讲>林晓斌的回答 大意是一个组合索引 (a,b,c) 条件 a > 5 and a <10 and b123, 这样的情况下是如何? 林老师给的回答是 A>5 ,然后下推B123 小友 问 "为什么不是先 进行范围查询,然后在索引下推 b123?" 然后就…...
CentOS7服务器中安装openCV4.8的教程
参考链接:Centos7环境下cmake3.25的编译与安装 参考链接:Linux安装或者升级cmake,例子为v3.10.2升级到v3.25.0(自己指定版本) 参考链接:Linux安装Opencv(C) 一、下载资源 1.下载cmake3.25.0的压缩包&am…...
Java课程设计:基于swing的贪吃蛇小游戏
文章目录 一、项目介绍二、核心代码三、项目展示四、源码获取 一、项目介绍 贪吃蛇是一款经典的休闲益智游戏,自问世以来便深受广大用户的喜爱。这个游戏的基本玩法是控制一条不断增长的蛇,目标是吃掉屏幕上出现的食物,同时避免撞到边缘或自身。随着游戏的进行,蛇的身体会越长…...
【HarmonyOS】HUAWEI DevEco Studio 下载地址汇总
目录 OpenHarmony 4.x Releases 4.1 Release4.0 Release OpenHarmony 3.x Releases 3.2.1 Release3.2 Release3.1.3 Release3.1.2 Release3.1.1 Release3.1 Release 说明 Full SDK:面向OEM厂商提供,包含了需要使用系统权限的系统接口。 Public SDK&am…...
华为OD刷题C卷 - 每日刷题30(小明找位置,分隔均衡字符串)
1、(小明找位置): 这段代码是解决“小明找位置”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,用于帮助小明快速找到他在排队中应该站的位置。 main方法首先读取已排列好的小朋友的学号数组和小…...
SOFTS: 时间序列预测的最新模型以及Python使用示例
近年来,深度学习一直在时间序列预测中追赶着提升树模型,其中新的架构已经逐渐为最先进的性能设定了新的标准。 这一切都始于2020年的N-BEATS,然后是2022年的NHITS。2023年,PatchTST和TSMixer被提出,最近的iTransforme…...
C++ 取近似值
描述 写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于 0.5 ,向上取整;小于 0.5 ,则向下取整。 数据范围:保证输入的数字在 32 位浮点数范围内 输入描述: 输入一个正…...
云原生系列之Docker常用命令
🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 系列文章目录 云原生之…...
opencv_GUI
图像入门 import numpy as np import cv2 as cv # 用灰度模式加载图像 img cv.imread(C:/Users/HP/Downloads/basketball.png, 0)# 即使图像路径错误,它也不会抛出任何错误,但是打印 img会给你Nonecv.imshow(image, img) cv.waitKey(5000) # 一个键盘绑…...
FlowUs轻量化AI:趁这波升级专业版,全年无限AI助力笔记产出与二次编写
在数字时代,信息管理与知识产出的效率直接影响个人的生产力。FlowUs作为一款集笔记、文档、多维表、文件夹于一体的新一代知识管理平台,其轻量化AI的加入更是如虎添翼。特别是在活动期间,升级专业版将带来全年无限AI使用次数,让每…...
Day 22:2786. 访问数组中的位置使分数最大
Leetcode 2786. 访问数组中的位置使分数最大 给你一个下标从 0 开始的整数数组 nums 和一个正整数 x 。 你 一开始 在数组的位置 0 处,你可以按照下述规则访问数组中的其他位置: 如果你当前在位置 i ,那么你可以移动到满足 i < j 的 任意 …...
理解Es的DSL语法(二):聚合
前一篇已经系统介绍过查询语法,详细可直接看上一篇文章(理解DSL语法(一)),本篇主要介绍DSL中的另一部分:聚合 理解Es中的聚合 虽然Elasticsearch 是一个基于 Lucene 的搜索引擎,但…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
