- 博客(62)
- 收藏
- 关注
原创 [Java EE] 多线程编程进阶
本文介绍了Java多线程编程中的核心概念与技术,主要包括: 常见锁策略:包括乐观锁/悲观锁、重量级锁/轻量级锁、自旋锁/挂起等待锁等,以及synchronized的自适应锁机制 synchronized原理:详细解析其锁升级过程(无锁→偏向锁→轻量级锁→重量级锁)和优化策略(锁消除、锁粗化) CAS机制:深入讲解比较交换操作的实现原理、ABA问题及解决方案 JUC工具类:包括Callable接口、ReentrantLock、原子类、信号量等并发工具的使用 线程安全集合:对比分析各种线程安全集合的实现原理和适
2025-11-29 22:09:39
1025
3
原创 [Java EE] 多线程进阶(3) [线程安全集合类]
线程安全的集合类 , 其核心解决普通集合(如 ArrayList/HashMap)在并发读写时的数据错乱 , ConcurrentMidificationException , 此循环等问题分类实现原理代表类核心特点同步包装类/全局加锁(),简单但并发性能低JUC 并发集合分段锁 / CAS / 写时复制 / 阻塞队列//精细化锁 / 无锁设计,高并发下性能更优此处不再说本质是对集合所有方法加 synchronized注意 : 迭代时需要手动加锁 , 否则抛异常(ConcurrentMidificat
2025-11-29 22:03:14
500
5
原创 [Java EE] 多线程进阶(JUC)(2)
继承 Thread 类(单独定义类/匿名内部类)实现 Runnable 接口(定义单独类/匿名内部类)lambda实现 Callable 接口(单独定义类/匿名内部类)线程池 ThreadFactory。
2025-11-27 21:02:22
977
4
原创 [Java 面试] 多线程1
读写锁就是把读操作和写操作分别进行加锁读写锁最主要哟个在 "频繁读 , 不频繁写" 的场景中如果获取锁失败 , 立即再尝试获取锁 , 无限循环 , 直到获取到锁为止;一旦锁被其他线程释放 , 就能第一时间获取到锁相比于挂起等待锁 :优点 : 没有放弃 CPU 资源 , 一旦锁被释放就能第一时间捕获 , 更高效 , 在锁持有时间比较短的场景下有用缺点 : 如果锁的持有时间较长 , 就会浪费 CPU 资源详情见下文的章节二t=P9T8。
2025-11-23 14:52:33
503
原创 [Java EE] 多线程进阶 (1)
悲观锁=>重量级锁=>挂起等待锁乐观锁=>轻量级锁=>自旋锁synchronzied 针对上述的锁策略是自适应的。
2025-11-23 14:12:45
970
6
原创 [Java EE] 多线程编程初阶
本文系统介绍了Java多线程编程的核心概念与技术。主要内容包括:1)线程基础,包括线程与进程的区别、创建线程的5种方法;2)线程状态管理,涵盖启动、中断、等待和休眠等操作;3)线程安全问题及解决方案,重点讲解synchronized关键字和volatile的应用;4)线程间协作机制wait/notify;5)多线程经典案例,包括单例模式、阻塞队列、线程池和定时器的实现。文章深入剖析了线程调度、锁机制、内存可见性等底层原理,并提供了大量实践示例,是掌握Java并发编程的全面指南。
2025-11-20 22:02:14
1205
10
原创 [Java EE] 多线程 -- 初阶(5) [线程池和定时器]
在 Java 中 , 定时器(Timer)用于按指定时间或周期性执行任务 , 常用方式有 : java.util,Timer 和 java.util.concurrent.ScheduledExecutorService。Executors 提供了快速创建线程池的静态方法 , 但不推荐在生产环境中使用 , 因为其默认参数可能导致资源耗尽(如无界队列可能导致 OOM): 调用者负责处理多出来的任务(让调用 submit 的线程自行执行任务): 丢弃新来的任务(当前 submit 的这个任务)
2025-11-19 17:40:58
1081
3
原创 [Java 算法] 双指针 2
利用排好序这个方面 , 使用双指针 , 每次循环都求一次和 , 如果这个 和大于 target , 只需让 right--;如果这个和小于target , 只需让 left++
2025-11-16 21:01:35
475
1
原创 [Java EE] 多线程 -- 初阶(4) [单例模式 阻塞队列]
(观察者模式 , 策略模式 , 迭代器模式 , 模板方法模式 , 命令模式 , 状态模式 , 责任链模式 , 备忘录模式 , 中介者模式 , 访问者模式 , 解释器模式) 3 类。, 在阻塞队列为空时 , 由于消费者线程是 take()操作 , 会陷入阻塞;, 即 编译器会优化执行顺序;(适配器模式 , 装饰器模式 , 代理模式 , 组合模式 , 外观模式 , 桥接模式 , 享元模式) ,(单例模式 , 工厂方法模式 , 抽象工厂模式 , 原型模式 , 建造者模式) ,
2025-11-16 20:31:12
930
2
原创 [Java EE] 多线程 -- 初阶(3)
在 Java 中 wait() 和 notify()是 Object 类的方法 , 用于线程间的协作 , 通常配合 synchronized 关键字使用 , 实现线程的等待与唤醒机制。唤醒在次对象锁上等待的任意一个线程(如果是多个线程对应同一个锁对象 , 那么具体唤醒哪个是随机的) , 使其从等待状态进入就绪状态 , 重新竞争锁。这是由于 JVM 的内存模型(JMM)中 , 线程会将共享变量从主内存拷贝到自己工作内存中进行操作 , 若缺乏同步机制 , 不同线程的工作内存数据可能不一致。
2025-11-13 20:01:17
953
1
原创 [Java EE] 多线程 -- 初阶(2)
针对每一把锁,操作系统内部维护了一个等待队列,当这个锁被某个线程占有时,其他线程尝试进行加锁,就加不上了,就会阻塞等待,一直到之前线程解锁后,有操作系统唤醒一个新的线程,再来获取到这个锁。:由多个步骤组成的操作(如 count++,实际就包括读取-更新-写回),若执行到一半就被其他线程抢占 CPU ,就可能导致数据错误。换句话说 线程修改共享资源后,主内存的数据未能及时同步到其他线程的工作内存,导致其他线程读取到旧值。这个锁本身的类型并不重要 , 重要的是 : 是否有其他线程尝试 竞争这个锁;
2025-11-11 21:41:45
983
1
原创 [Java EE] 多线程 -- 初阶(1)
用来返回线程的的名称方法说明中断对象关联的线程,如果线程正在阻塞,则以异常方式通知,否则设置标识位publicstatic判断当前线程的中断标志位是否设置,调用后清楚标志位判断对象关联的线程的标志位是否设置,标志后不清楚标志位while(!Thread.currentThread().isInterrupted()){//判定线程是否被终止了try {break;System.out.println("t线程结束");});t.start();
2025-11-09 23:34:58
994
1
原创 [Java EE] 计算机基础
寄存器 : CPU 内部的超小容量、超高速存储单元,专门存放 CPU 正在使用的指令、数据或运算结果。主要用来进行逻辑操作 , 最基本的就是 与,或,非操作 , 当不只是 1 位数的比较。CPU 的核心组件之一,负责协调所有硬件部件按指令有序工作,是流程的 “调度中心。,为 CPU 提供高速可访问的 “工作区”,是连接 CPU 与外存的关键桥梁。ALU 是计算实际中进行算数,逻辑运算的核心部件 , 是计算机的数学大脑。针对数据访问速度 : cpu>>内存>硬盘。针对存储空间 : 硬盘>内存>>cpu。
2025-11-09 12:05:16
199
原创 [Java算法] 双指针(1)
补充 : 当三个数为有序时 , 只需判断两个较小数之和是否大于较大数即可 , 如果两个较小数之和大于较大数则是三角形 , 无需再判断剩下两类。用 count 来标记统计结束的下标 , cur 找结束的位置 , 如果 cur 是 0 则 cout+2 , 非零加一 ,再判断 count 的长度是否是比 len 多 1(末尾为 0),是则做处理。没懂 , 自己画图没有问题 , 代码跑起来有问题。运用到快速排序的思想。最后从后往前复写操作。
2025-11-08 23:03:43
744
原创 [MySQL] JDBC
JDBC (Java Data Base Connectivity,Java数据库连接)是 Java 程序和数据库之间的桥梁 , 包含了一套 Java 定义于执行 SQL 语句的接口 , 使开发者能够编写数据库的程序JDBC 的主要作用与数据库建立连接 , 发送 SQL 语句 , 处理数据库执行结果JDBC 工作原理加载驱动 , 建立连接 , 创建 Statement , 执行 SQL , 处理结果 , 关闭资源。
2025-11-02 14:11:01
1536
1
原创 [MySQL] 页与索引
B+树是一种经常用于数据库和文件系统等场合的平均查找树 , MySQL 索引采用的数据结构 , 以 4 阶 B+树为例在二叉搜索树的基础上可以有效控制树高 , 也就意味着在在相同数据量的情况下 可以有效减少 IO 次数 , 从而提升效率。
2025-10-31 22:29:16
1293
原创 [MySQL] 视图
视图是一个虚拟的表 , 它是基于一个或者多个基本表 或者 其他视图的查询结果集视图的本身不存储数据 ,而是通过执行查询来动态生成数据;用户可以像操作普通表一样来使用视图来进行查询 ,更新 ,管理;视图本身并不占用物理存储空间 , 它仅仅是一个查询的逻辑表示 , 物理上它依赖于基础表中的数据语法视图名;示例 : show create view class_1_scores;
2025-10-29 21:49:21
261
原创 [MySQL] CRUD 进阶
本文介绍了SQL中的新增语法和查询操作。主要内容包括:1.新增insert into...select语法,用于将旧表数据导入新表;2.聚合查询,包括count、sum、avg等聚合函数及group by分组、having过滤;3.联合查询的各种方式:内连接、外连接(左右连接)、自连接;4.子查询的三种用法(where、from、select子句)及单行/多行子查询;5.合并查询操作如union、union all等。文章通过示例详细演示了每种查询的使用方法和注意事项,帮助理解SQL的数据查询与操作。
2025-10-28 12:20:39
894
原创 [MySQL] 数据库设计
数据库的范式是一组规则在设计关系数据库时 , 遵循不同的规范要求 , 设计出合理的关系型数据库 , 这些不同的规范要求被称为不同的范式关系型数据库有 六种范式 : 第一范式(1NF) , 第二范式(2NF) , 第三范式(3NF) , 巴斯-科特范式(BCNF) , 第四范式(4NF) , 第五范式(5NF,又称完美范式) 越高的范式数据库冗余越小 , 并且普遍认为范式越高对数据关系有更好的约束性 , 但是 也可能导致 IO 更繁忙 , 因此在实际应用中 , 数据库设计通常只需满足第三范式 正例 :反例 :
2025-10-23 21:56:12
717
1
原创 [MySQL] CRUD(基础)
示例 :insert exam_result values(9,'马超', 87.5, 76, NULL);NULL 不论与任何值运算 , 返回值都是 NULL;NULL 始终被判定为 False;NULL 的值不为 0 , 它就是 NULL。
2025-10-20 00:41:30
689
1
原创 [MySQL] 基础操作
语法 : 语法 : 示例 :语法 : 语法 : 语法 : 语法 : 语法 : 语法 : 语法 :数值类型大小说明对应 Java 类型BIT[(M)]M 指定位数 , 默认为 1二进制数 , M 的范围从 1 到 64 , 存储数据范围从 0 到 2^M-1常用 Boolean 对应 BIT , 此时默认是一位 , 只能存 0,1TINYINT[(M)]1 字节范围 -2^7~2^7-1 , 无符号范围 2^8-1ByteBOOL1 字节TINYINT(1)同义词 , 0 为假 , 非 0 为真Boolean
2025-10-18 16:21:34
954
1
原创 [数据结构] 哈希表
理想的搜索方法 : 可以不经过任何比较 , 一次直接从表中得到要搜索的元素 . 如果构造一种存储结构 , 通过某种函数 使元素的存储位置与它的关键码之间能够建立 一一映射的关系 , 那么在查找时通过该函数可以很快找到该元素。虽然哈希表一直在和冲突作斗争 , 但在实际使用的过程中 , 我们认为哈希表的冲突率是不高的 , 冲突的个数是可控的 , 每个桶中的链表长度是一个常数 , 所以在通常情况下 , 认为哈希表的 插入/删除/查找的时间复杂度是 O(1)通过哈希函数获取待插入元素 在哈希表中的位置。
2025-10-12 18:08:17
721
原创 [数据结构] Map和Set
本文摘要: 二叉搜索树是一种有序数据结构,具有左子树小于根节点、右子树大于根节点的特性。文章详细介绍了二叉搜索树的查找、插入、删除操作实现及性能分析,指出最优情况为完全二叉树(O(logN)),最差情况为单分支树(O(N))。同时对比了Java中的TreeMap/HashMap和TreeSet/HashSet实现,说明Tree系列基于红黑树保证有序性(O(logN)),而Hash系列通过哈希表实现高效查找(O(1))。文章还讲解了Map和Set接口的使用方法,包括键值对操作、遍历方式等,并强调Tree结构不
2025-10-10 17:12:27
1180
原创 [数据结构] 排序
本文系统介绍了常见排序算法及其实现。主要内容包括:1)排序概念与分类(内部/外部排序、稳定性);2)经典排序算法实现(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序);3)算法性能测试与对比;4)复杂度与稳定性分析。重点阐述了各算法的核心思想、代码实现及优化策略,如快速排序的挖坑法和前后指针法、归并排序的分治思想等。测试结果表明,不同算法在时间/空间复杂度上存在显著差异,其中快速排序和归并排序表现较优。最后总结了各算法的时间复杂度(O(n²)到O(nlogn))、空间复杂度及稳定性特征,
2025-10-01 20:12:38
719
原创 [数据结构]优先级队列
本文系统介绍了优先级队列(堆)的实现与应用。首先阐述了优先级队列的概念,即支持按优先级存取元素的数据结构。重点讲解了堆的创建与调整方法,包括向下调整(siftDown)和向上调整(siftUp)两种核心算法,分析了它们的时间复杂度均为O(logn)。随后详细说明了堆的插入、删除操作实现,并给出基于大根堆的升序排列算法。最后介绍了Java中的PriorityQueue类及其构造方法、常用API,以及堆在TopK问题中的典型应用。全文通过代码示例直观展示了优先级队列的各种操作实现方式。
2025-09-26 23:14:00
1151
原创 [Java 算法] 二叉树(1)
二叉树的( 层序 )遍历相当于广度优先遍历,( 前序 )遍历相当于深度优先遍历。(每个节点有三个指针,除了左、右子节点指针,还有指向父节点的指针)如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。(每个节点有两个指针,分别指向左、右子节点)和。具有相同结构和节点值的子树。,编写一个函数来检验这两棵树是否相同。的某个节点和这个节点的所有后代节点。,翻转这棵二叉树,并返回其根节点。≥1),则其父亲节点的编号为 ⌊。给你一棵二叉树的根节点。给你两棵二叉树的根节点。给你一个二叉树的根节点。
2025-09-25 12:47:16
301
原创 [数据结构] 二叉树
本文摘要: 树与二叉树是重要的数据结构。树由不相交的子树构成,每个结点有唯一父节点。二叉树是每个结点最多有两个子树的树结构,包含满二叉树和完全二叉树两种特殊形式。文章详细介绍了二叉树的性质、存储方式(链式存储)、创建方法及四种遍历方式(前序、中序、后序和层序遍历),并提供了Java实现代码。此外,还讲解了获取结点数、叶子结点数、树高度等基本操作,以及判断完全二叉树的方法。二叉树在表达式解析、数据压缩等方面有广泛应用,其操作时间复杂度通常与树高相关。
2025-09-21 22:33:40
1004
原创 [数据结构] 队列 (Queue)
如果为空 : 需要把第一个栈中的所有元素都放到第二个栈里 , 取出第二个栈中的顶层元素。boolean(删除成功返回 true,队列为空则返回 false)boolean(插入成功返回 true,队列满则返回 false)boolean(为空返回 true,否则返回 false)boolean(已满返回 true,否则返回 false)双端队列 是 指允许两端都可以进行入队和出队操作的队列。查看队头元素(不删除,队列空时抛出异常)查看队头元素(不删除,队列空时返回。移除并返回队头元素(队列空时返回。
2025-09-13 13:41:40
835
1
原创 [数据结构] LinkedList
摘要:LinkedList是Java集合框架中的双向链表实现,具有高效的插入/删除操作(O(1))但随机访问性能较差(O(n))。它实现了List和Deque接口,支持头尾操作和双向遍历。与ArrayList相比,LinkedList更适合频繁增删场景,而ArrayList更适合随机访问。文章详细介绍了LinkedList的特性、常用方法、四种遍历方式,并通过模拟实现展示了其双向链表的底层结构。最后对比了LinkedList和ArrayList在存储结构、访问效率和应用场景上的差异。
2025-09-06 13:54:37
1037
原创 [数据结构] 链表
从堆上申请的空间 , 是按照一定的策略来分配的 , 两次申请的。实际中的链表的结构非常多样 , 以下情况组合起来就有8种。上非连续 的存储结构 , 数据元素的逻辑顺序是通过。现实中的结点一般都是从 堆上申请出来的。头结点可以存放数据 , 但是无任何意义。无头单项非循环链表的实现。带头结点或者不带头结点。2.链表分类(8种)
2025-09-04 22:27:21
582
1
原创 [数据结构] ArrayList与顺序表(下)
在「杨辉三角」中,每个数是它左上方和右上方的数的和。: 给定一个非负整数 numRows。生成「杨辉三角」的前 numRows。
2025-08-28 21:24:56
305
原创 [数据结构] ArrayList 与 顺序表
ArrayList 是以泛型方式实现的,使用时必须要先实例化Arraylist 实现了Randomaccess接口,表明ArrayList支持随机访问ArrayList 实现了Cloneable接口,表明ArrayList是可以被clone的ArrayList 实现了Serializable接口,表明ArrayList是支持序列化的和Vector不同,ArrayList 不是现成安全的,在单线程下可以使用,在多线程中 可以使用 Vector 或者 CopyOnWriteArrayList。
2025-08-18 23:32:17
1268
1
原创 [ 数据结构 ] 泛型 (上)
本文介绍了Java包装类和泛型的核心概念。包装类部分详细讲解了基本数据类型的包装类、装箱拆箱操作、自动转换机制及Integer缓存机制。泛型部分重点阐述了泛型类定义语法、类型推导、类型擦除机制和通配符使用(包括无界、上界和下界通配符),并提供了泛型方法的定义示例。全文通过代码实例演示了包装类和泛型在实际编程中的应用,帮助理解Java类型系统的特性和实现机制。
2025-08-13 20:16:57
816
1
原创 [ 数据结构 ] 时间和空间复杂度
在实际中一般关注的是算法的 最坏运行情况 , 所以数组中搜索数据的时间复杂度为O(N)最好情况 : 一次找到 最坏情况 : N次找到 平均情况 : N/2次找到。定义 : 再计算机科学中 , 算法的时间复杂度 是一个数学函数 , 它定量描述了。例如: func1使用大O简静法表示后 , func1的时间复杂度为 O(N^2)通过用大O的渐进表示法 去掉了对结果影响不大的项 , 简洁明了的表示出了执行次数。另外 有些算法还存在 时间复杂度 最好 , 最坏 , 平均的情况。
2025-08-12 19:52:43
445
原创 [Java 面试] Java SE(异常)
Java异常处理摘要:throw用于方法体内主动抛出异常对象,而throws在方法声明处声明可能抛出的异常类型。finally块通常总会执行,但存在程序提前终止、JVM崩溃等特殊情况可能阻止其执行。理解这些机制对编写健壮的异常处理代码至关重要。
2025-08-08 00:07:18
314
原创 【Java SE】异常
程序先执行 try 中的代码如果 try 中的代码出现异常 , 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配如果找到匹配的异常类型 , 就会执行 catch 中的代码如果没有找到匹配的异常类型 , finally 中的代码会被执行到如果上层调用者也没有处理异常 , 就会继续向上传递一直到 main 方法也没有合适的代码处理 异常 , 就会交给 JVM 来处理 , 此时程序就会异常终止。
2025-08-07 23:59:43
1086
原创 【Java SE】String类(2)--StringBuilder和StringBuffer
由于String的不可更改性, 为了方便字符串的修改,Java中又提供 StringBuilder和 StringBuffer类这两个类大部分功能是相同的, 这里介绍StringBuider常用的一些方法从上述例子可以看出: String和StringBuilder最大的区别在于:String的内容无法修改而StringBuilder的内容可以修改频繁修改字符串的情况考虑使用StringBuilderString和StringBuilder类不能直接转换。
2025-08-02 15:08:22
356
原创 【Java SE】String 类(1)
字符串在 Java 中是不可变的(immutable),任何对字符串的修改操作都会返回一个新的字符串对象。①String 类在设计时就是不可变的, String类实现描述已经说明了:String类中的字符实际保存在内部维护的value字符数组中。与equals不同的是, equals 返回的是 boolean 类型, 而compareTo 返回的int类型。②所有涉及到可能修改字符串内容的操作都是创建一个新的对象那个, 改变的是新对象。String是一种不可变对象.字符串的内容是不可改变的。
2025-08-01 14:52:58
1218
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅