- 博客(44)
- 收藏
- 关注
原创 Java单例模式中的饿汉模式和懒汉模式
无论是饿汉模式的急切创建,还是懒汉模式的延迟加载,都为我们在软件开发中实现类实例的唯一性提供了有力的工具。在实际项目中,我们应根据具体的需求和场景,灵活选择合适的单例模式实现方式,以构建出更加健壮、高效的软件系统。由于实例的创建是在类加载阶段完成的,而类加载过程由 JVM 严格管控,天然具备线程安全性,因此不存在线程安全方面的困扰。然而,在多线程环境下,这种简单的实现方式可能会出现多个线程同时判断lazy为null,进而创建多个实例的情况,这显然违背了单例模式的初衷。与饿汉模式形成鲜明对比的是懒汉模式。
2025-03-23 22:19:36
799
15
原创 阻塞队列:原理、应用及实现
阻塞队列是一种特殊且实用的队列数据结构,它同样遵循 “先进先出” 的原则。与普通队列不同的是,阻塞队列是线程安全的,这使得它在多线程编程中扮演着重要角色。当队列已满时,如果有线程尝试将元素入队列,该线程将会被阻塞,直到有其他线程从队列中取走元素,使得队列腾出空间。当队列为空时,若有线程试图从队列中出队列,此线程也会被阻塞,直至有其他线程向队列中插入新的元素。阻塞队列的一个经典应用场景便是 “生产者消费者模型”。这种模型在软件开发中被广泛使用,能够有效地协调不同线程之间的工作,提高程序的性能和稳定性。
2025-03-23 22:19:07
996
9
原创 【线程安全问题的原因和解决方案】
在上述 count++的例子中,count++ 操作在执行过程中涉及三个 CPU 指令(取值、+1、赋值),因此 count++ 操作不具有原子性。如果修改操作只对应一个 CPU 指令,则可以认为是原子的,不会出现线程安全问题。两个线程同时修改 count,分别进行 5000 次 count++,预期结果为 10000,但实际结果小于 10000,出现线程安全问题。volatile 关键字可以确保变量的可见性,即当一个线程修改了 volatile 变量的值,其他线程可以立即看到修改后的值。
2025-03-12 18:31:20
925
8
原创 【深入理解Java线程状态:从理论到代码实践】
在Java多线程编程中,线程状态的理解至关重要。它不仅能帮助开发者优化程序性能,还能有效排查线程相关的问题。本文将详细介绍Java线程的六种状态,并通过具体代码示例进行深入讲解。NEW(新建):安排了工作,但是还没开始行动。RUNNABLE(可运行):可工作的(正在工作中和即将开始工作的)。BLOCKED(阻塞):线程阻塞等待监视器锁定。WAITING(等待):线程等待另一个线程执行特定动作。TIMED_WAITING(限时等待):具有指定等待时间的等待线程状态。TERMINATED(终止)
2025-03-12 18:30:54
921
16
原创 【Java线程基础操作详解】
在Java编程里,线程是实现多任务处理的关键概念。本文会详细讲解Java中线程的创建、中断、等待以及休眠等操作,通过丰富代码示例和详细解释,助力你理解相关知识。
2025-03-06 20:39:15
1101
14
原创 【进程和线程】(面试高频考点)
在计算机编程领域,并发编程是一项至关重要的技术,而进程和线程正是实现并发编程的核心概念。为了让大家更直观地理解并发编程的作用,我们先来看一个简单的生活例子。想象一下,现在有一大份美味的饭菜,而 A、B、C、D 四个人都饥肠辘辘地需要吃饭。如果按照传统的顺序依次就餐,那么情况可能会是这样的:从图中可以明显看出,这种顺序执行的方式效率较低,每个人都需要等待前面的人吃完才能开始就餐。然而,如果我们能够让这四个人同时吃饭,实现并发编程的效果,那么将会极大地节省时间,显著提高整体的就餐效率。
2025-03-06 20:38:54
695
13
原创 什么是死锁?构成死锁的条件&如何解决
在计算机科学中,死锁是一种非常常见且棘手的问题。从线程和锁的角度来看,死锁主要存在三种典型情况:一线程一锁、两线程两锁以及 M 线程 N 锁。接下来,我们将通过具体的实例对这三种情况进行详细剖析。
2025-02-25 21:04:58
1090
8
原创 事务的4个特性和4个隔离级别
事务,简单来说,就是将一组SQL语句组合成一个逻辑单元,这些语句要么全部成功执行,使数据库状态发生预期的改变;要么全部失败,数据库回滚到事务开始前的状态,仿佛这组操作从未发生过。以日常生活中的转账场景为例,当A向B转账100元时,“A账户减少100元”和“B账户增加100元”这两个操作必须作为一个整体来执行,要么都成功完成转账,要么因为任何原因(如余额不足、网络故障等)都不执行,以保证资金的准确性和一致性。这,就是一个典型的事务。
2025-02-25 21:04:24
1082
15
原创 【MySQL索引:B+树与页的深度解析】
B+树是一种在数据库与文件系统等领域广泛应用的平衡查找树。数据存储位置:数据库中的数据存储于磁盘之上。页内地址连续性:磁盘中每个页内部的地址是连续的。页的作用与大小:页是内存与磁盘交互的最小单元,默认大小为16KB。即便某一页没有数据,也会占用16KB的存储空间,并且页与索引的B+树节点相对应。在MySQL中存在多种类型的页,其中最常用的便是用于存储数据和索引的“数据页”或“索引页”。无论何种类型的页,都具备“页头”与“页尾”,页的主体信息则由“数据行”填充。
2025-01-18 23:45:03
1541
11
原创 【SQL 中的分组查询与联合查询详解】
联合查询用于将多个查询结果合并在一起,常见的联合查询包括内连接、外连接、自连接、子查询和合并查询等。它能够根据指定的列将数据分组,并对每个组的数据进行聚合计算,从而得到我们需要的统计信息。子查询是指在一个查询中嵌套另一个查询,将内层查询的结果作为外层查询的条件。子查询可以分为单行子查询和多行子查询。左外连接以左表为基准,左边的数据全部显示,右边的数据没有对应记录的显示为。右外连接以右表为基准,右边的数据全部显示,左边的数据没有对应记录的显示为。关键字会将两个查询结果直接合并,保留所有的行,包括重复的行。
2025-01-18 23:44:41
1404
17
原创 【查找完整代码实现】折半查找、二叉排序树查找、哈希表查找(基于开放地址法的散列查找、基于拉链法的散列查找)
【代码】【查找完整代码实现】折半查找、二叉排序树查找、哈希表查找(基于开放地址法的散列查找、基于拉链法的散列查找)
2025-01-08 15:50:56
174
19
原创 两个链表求并集、交集、差集
两个链表求并集、交集、差集其实都是创建一个新链表然后遍历插入的题型,所以下边就举并集一个例子。两个链表求并集、交集、差集。
2024-11-11 15:10:29
639
23
原创 【二叉树进阶题目2】(算法题详细简介)
下面是本文讲解的题目链接,大家可以先自己尝试一下,再看下文题解~5. 二叉树的层序遍历 ||(力扣107)6. 二叉树的层序遍历(力扣102)7. 根据二叉树创建字符串(力扣606)8. 二叉树的最近公共祖先(力扣236)
2024-10-28 23:31:59
740
23
原创 【二叉树进阶题目1】(算法题详细简介)
下面是本文讲解的题目链接,大家可以先自己尝试一下,再看下文题解~1. 用非递归的方法实现中序遍历2. 非递归的方法实现先序遍历3. 从中序与后序遍历序列构造二叉树4. 从前序与中序遍历序列构造二叉树。
2024-10-28 23:28:03
1027
24
原创 【二叉树的相关操作】(有超多图解!)
二叉树的前序遍历,中序遍历,后序遍历,获得树中节点个数,获得叶子节点个数,获得第k层节点的个数,获得二叉树的高度,检测元素是否存在,判断一个树是不是完全二叉树。
2024-10-17 23:45:07
614
27
原创 【双向链表的模拟实现】
由于上一篇文章已经详细讲述了单向链表的功能及模拟实现,所以双向链表这里就不在赘述,主要讲解双向链表与单向链表的区别,以及其代码实现。
2024-10-10 20:26:57
380
25
原创 【单链表的模拟实现Java】
下面为链表的一些基本功能,该文章也将详细讲解下列方法的模拟实现。(由于后续还要实现双向链表的相关方法,所以这里使用接口)到这里上面的基础功能已经全部实现,现在就开始使用一下。该文章到这里就结束了,希望对你有所帮助!Mylinkedlist链表。首先我们先判断链表是否为空。在指定位置插入分三种情况。链表的尾插分两种情况。删除主要讨论两种情况。main方法如下所示。
2024-10-10 20:26:36
914
22
原创 【Java异常】(简简单单拿捏)
程序员在运行代码时会遇到很多异常,比如:数组越界异常,空指针异常。编译时异常在程序编译时发生的异常运行时异常在程序运行时发生的异常这里的例子直接和自定义异常一起讲了呦首先了解一下自定义异常:我现在要检查输入的账号和密码是否出现异常,所以我先分别创建AccentException和PasswordException,然后让上述两个自定义异常继承Exception代码操作如下所示super();super();
2024-09-27 23:04:40
582
13
原创 初始泛型【超级详细哦~】
泛型:就是适用于许多许多类型。使用泛型可以通过自动装箱储存Integer等对象,不仅能储存基本类型,还能储存复杂对象,这样为程序提供了更大的通用性。使用泛型较数组的好处int[ ]…之前我们就学过数组,只能创建静态数组,只提供基本的访问和遍历操作。你需要手动输入更多复杂的操作,如增删查改。:使用泛型时,不仅可以创建动态数组,装箱后还提供了很多复杂的操作,如:List的增删查改方法。
2024-09-20 23:26:27
403
14
原创 图书管理系统(面向对象的编程练习)
下面主要展示系统的删除图书功能和显示图书功能,帮助大家在开始写代码前先了解图书管理系统的相关内容。这里以删除和展示图书为例,大家可以自行实现其他功能,有什么问题大家可以评论区交流呦~~~由于这一部分比较简单,所以不在此赘述,直接上代码!4、目前为止的演示(主要检查不同操作人员的多态实现)(和上述manager相似,不做过多解释)2、演示上述代码(重新顺一下思路)(以删除图书和展示图书为例)2、创建booklist类。2、创建子类manager。1、创建父类people。3、创建子类user。
2024-09-19 23:08:19
529
7
原创 【时间复杂度和空间复杂度】(内含超多实例练习)
算法的时间复杂度是一个数学函数,一个算法所花费的时间与其中的语句的执行次数成正比。所以factorial 的时间复杂度为 O(N)在编程过程中衡量一个算法的好坏看的是。下面是一些关于时间复杂度的练习题。空间复杂度是对一个算法在运行过程中。
2024-08-01 22:32:28
369
3
原创 【多态】(超级详细!)
面向对象的三大特征:封装性、继承性、多态性。extends继承或者implements实现,是多态性的前提。这篇文章中的多态都由继承实现。
2024-05-28 20:40:10
990
14
原创 【Java继承】(超级详细!!!)
继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。其中:Animal类称为父类/基类或超类,Dog和Cat可以称为Animal的子类/派生类。继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可。通过上述知识我们知道:当子类和父类中存在相同名称的成员时,访问子类的成员。继承机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在。super的用法远不止这些,super的其他方法会在下文中提到。那么,,如果要在子类方法中访问父类同名成员时,该如何操作?
2024-05-27 20:47:57
1394
12
原创 【封装和继承】(内含超多代码解读!)
同样,我们这篇文章依旧采用简单理解一下基本概念,然后直接通过代码举例来深入学习。以此达到更好的学习效果!
2024-05-14 23:43:24
436
8
原创 【初始类和对象】(实例讲解!超级详细!)
由于类和对象是我们在学习过程中需要接受的概念性新知识,所以我会先带大家简单理解一下类和对象的基本概念,然后直接通过代码举例来深入学习,最后总结知识。以此达到更好的学习效果!
2024-05-11 11:29:33
799
6
原创 【C语言和Java的对比学习】2(布尔类型、运算符、程序逻辑控制)
这篇文章主要讲解了在布尔类型、运算符和程序逻辑控制方面C语言和Java的对比学习
2024-05-04 00:18:29
373
2
原创 【C语言和Java的对比学习】1
相信有很多人都是先学习了C语言之后转战Java,发现Java和C中有很多的相似之处,想要在Java的学习过程中更加方便了解两者的不同,或者是在转战的过程中经常把C和Java弄混,又或者是经常学了Java忘了C,那么解决这些疑问最好的方法便是对比学习,这样了解两者不同的同时,对C和Java也有了更好的了解。所以我将会通过这篇文章(以后可能会再出几篇)讲解Java和C的对比学习。好了!废话不多说了,开始学习吧!!!
2024-04-24 22:09:37
362
3
原创 【数据在内存中的存储】
其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,下面是具体的概念:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。上述概念需要记住,方便分辨大小端。由于VS是小端存储,那我就举小端存储为例,大端存储大家可以同理推导。
2024-04-01 10:58:30
913
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人