自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 详解单例模式:饿汉、懒汉与线程安全优化

单例模式的核心是确保类在程序中仅存一个实例,关键围绕 “创建时机” 与 “线程安全” 展开:饿汉模式在类加载时提前创建实例,简单且天然线程安全,但可能浪费资源;懒汉模式首次调用时延迟创建,需通过 “双重检查锁+ volatile” 解决线程安全与指令重排序问题,避免资源浪费但实现稍复杂。

2025-09-09 19:55:02 450

原创 Java 中 wait 与 notify 的详解:线程协作的关键机制

wait 与 notify 是 Java 中实现线程间协作的重要机制,它们与锁紧密配合,能够有效解决线程竞争导致的问题(如线程饿死)。正确理解和使用这两个方法,对于编写高效、可靠的多线程程序至关重要。使用时需特别注意锁对象的一致性和 wait/notify 的调用顺序,以避免程序出现难以调试的并发问题。

2025-09-08 14:10:00 617

原创 深入解析 Java 内存可见性问题:从现象到 volatile 解决方案

用 volatile 关键字修饰变量。在实际开发中,当多个线程涉及同一变量的读写操作时,及时使用 volatile,能有效避免因内存可见性引发的线程安全隐患。

2025-09-07 14:46:14 809

原创 Java 并发编程解析:死锁成因、可重入锁与解决方案

当多个线程(N个)需要按顺序获取多把锁(M把),如果线程间出现循环等待锁的情况(你等我的锁,我等他的锁,最后又绕回来等你的锁),就会触发死锁。哲学家就餐问题是 “N个线程 + M把锁” 引发死锁的经典案例。死锁是并发编程中的 “隐形陷阱”,但并非无法预防。核心在于理解它的四个必要条件,并通过 “避免嵌套加锁”“约定加锁顺序” 等方式破坏这些条件。

2025-09-04 18:52:40 555

原创 线程安全问题及解决方案

线程安全问题是多线程编程中常见的挑战,其根源在于操作系统的抢占式调度机制以及非原子操作对共享资源的并发修改。通过synchronized关键字,我们可以对关键代码块或方法进行加锁,确保其原子性执行,从而有效解决线程安全问题。在实际开发中,合理使用synchronized需要注意两点:一是代码块的范围要恰当,二是锁对象的选择要正确。只有这样,才能在保证线程安全的同时,尽可能减少对程序性能的影响。

2025-09-02 20:35:25 853 4

原创 Java 线程的状态、终止与协作全解析

本篇文章主要讲 Java 中线程相关的知识。我会先说说前台线程和后台线程的区别,前台线程会影响整个程序的结束,必须都跑完程序才算结束;后台线程则不影响,主程序结束了它也跟着结束。我们自己创建的线程,包括 main 主线程,默认都是前台的,不过可以用 setDaemon 改成后台的。另外,还会讲到线程的生命周期,Thread 对象和系统线程不是一回事,可能对象还在,线程已经没了。还有线程怎么终止,比如用标志位,或者 interrupt 方法;

2025-08-21 17:27:48 724

原创 线程的概念、特点与创建方式

线程作为进程里的 “轻量级工人”,靠着共享资源、创建销毁成本低的特点,让程序能更高效地 “同时” 处理多个任务。不过要注意的是 ——线程太多也会拖慢速度,一个线程出异常还可能影响整个进程,这些都是我们在使用多线程时要注意的。另外,从创建线程的两种方式,我们便能看出编程里 “解耦合、高内聚” 的设计智慧,这可以让我们的代码更灵活、易维护。多线程就像一把双刃剑,用好了可以提升效率,但我们在使用的过程中也得小心线程安全、调度开销这些 暗坑”。

2025-08-17 15:08:45 1058

原创 探秘计算机:从硬件构成到进程运转的核心逻辑

从硬件的组装到指令的二进制流转,从进程的状态切换到资源的智能分配,计算机的每一个细节都体现了 “分工协作” 的智慧。CPU 作为核心处理器,存储器负责数据流转,操作系统则像 “交通指挥官”,让进程可以有序运行。理解这些底层逻辑,不仅能帮助我们更好地使用计算机,更能窥探到信息时代的技术基石 —— 正是这些看似复杂的机制,共同支撑起了数字世界的高效运转。

2025-08-16 10:06:32 670

原创 数据库事务深度解析:从 ACID 到隔离级别的实践逻辑

事务作为数据库保证数据可靠性的核心机制,其 ACID 特性是数据一致性的 “四大支柱”—— 原子性确保操作无中间态,一致性守护数据规则不被破坏,隔离性化解并发冲突,持久性保障结果稳定落地。而隔离级别的选择,则体现了在并发性能与数据安全之间的平衡智慧:从读未提交到串行化,每一级别都有其适用场景。理解事务的运行逻辑,不仅能帮助我们在开发中规避数据不一致的 “坑”,更能让我们在设计系统时,根据业务需求灵活选择合适的隔离策略,在保证数据安全的同时兼顾系统性能。

2025-08-11 14:37:45 779

原创 MySQL 查询四大核心技巧:聚合、分组、联合与子查询详解

MySQL数据库查询操作详解:聚合、分组、联合与子查询

2025-08-04 16:14:40 705 1

原创 数据库范式入门:1NF、2NF、3NF 原理与实践

综上,第一范式可以筑牢字段原子性根基,第二范式可以消除部分依赖的现象,第三范式则可以规避传递依赖。遵循这三大范式设计数据库表,能有效化解数据冗余、更新异常等难题,让数据存储更合理、关联更清晰。掌握范式,是搭建高效、可靠数据库,为业务数据精准服务的重要一步,助力我们在数据管理之路上走得更稳、更远。

2025-07-29 16:41:41 698

原创 MySQL 数据操作入门:从新增到删除的全流程实战指南

通过本文的案例演示,我们系统学习了 MySQL 中新增、查询、修改和删除数据的常用语法及注意事项 —— 从全列插入与指定列插入的区别,到查询时的去重、排序、分页技巧,再到修改数据时的条件限制和删除操作的安全规范。这些基础操作是数据库开发的基石,熟练掌握后能大幅提升数据处理的效率。需要注意的是,在实际开发中,修改和删除操作务必谨慎,建议先通过查询语句确认目标数据,再结合条件限制避免误操作。希望本文的内容能帮助你夯实 MySQL 基础,为更复杂的数据库操作打下坚实的基础。

2025-07-28 16:07:58 664

原创 Mysql中数据表的设计

数据库约束是确保数据完整性的关键机制,通过预定义的规则自动校验数据,避免人工检查的繁琐和潜在错误。约束作用于表的列上,确保数据的正确性和关联关系的有效性。以下是常见约束类型的详细说明及示例。用于禁止某列存储空值(NULL),强制字段为必填项。先来看看不加约束的学生表格所展示出来的信息: 当没有指定非空约束的时候,当前的列表示是可以写入一个NULL的值的,如果要把某一列定义为一个必填项,那么就可以使用not null来进行约束。示例如下: 如图所示这个NO就表示当前列(id列)不能为空 下面我们插

2025-07-27 17:03:31 1138 6

原创 哈希表讲解

计算公式为:

2025-07-20 16:29:45 989

原创 Treemap和TreeSet

Treemap 和 Treeset 的插入、删除和查找操作的时间复杂度均为 O(log n)。在频繁插入和删除场景下可能不如 HashMap 和 HashSet 高效。Treemap 适用于需要按键排序的场景,例如存储学生成绩并按学号排序;Treeset 适用于需要有序且唯一的元素集合,例如去重并排序一组数据。Treemap 和 Treeset 是 Java 中高效的有序集合实现,基于红黑树保证了元素的有序性和操作的高效性。

2025-07-20 10:12:50 647

原创 Java—二叉搜索树代码实现

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树如下图所示这就是一棵二叉搜索树。

2025-07-16 12:49:00 618

原创 Java中重写与重载

在 java 中,一个类可同时定义为许多同名的方法,这些方法的形式参数个数,类型或顺序各不相同,传回的值可能各不相同,这种面向对象的特性称为()

2025-05-10 11:30:00 741

原创 Java类和对象

类是用来对一个实体对象来进行描述的,主要描述该实体对象具有哪些属性外观尺寸等,哪些功能用来干啥,描述完成后计算机就可以识别了。2.2类的定义格式类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能,称为类的成员方法。类名注意采用大驼峰定义2.3定义一个学生类//字段 属性 成员变量 定义在类当中,方法的外边//学号//所属的班级this引用指向当前对象成员方法运行时调用该成员方法的对象。

2025-04-28 21:26:05 700

原创 二叉树中序遍历的实现思路和易错点

先按照每一层从左到右进行输出输出完这一层之后再往下一层遍历输出结点数据从根节点开始 从上到下 从左到右 一层一层的输出遍历二叉树要引入队列访问输出完一个结点如何找到下一个结点是一个难点这个时候我们就可以引入一个队列引入的原因如下:因为我们在遍历一个结点的时候需要用一个数据结构把这个结点的孩子直接先记录下来,放到该数据结构当中再依次访问(取出)该结构中的首个元素与此同时再把这个拿出来的队首元素的存在的所有非空孩子放到队列当中 以此类推。

2025-04-06 16:26:25 295

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除