L-KKKKK
码龄3年
关注
提问 私信
  • 博客:11,465
    社区:395
    11,860
    总访问量
  • 49
    原创
  • 745,864
    排名
  • 8
    粉丝
  • 0
    铁粉

个人简介:不必急于求成,因为人常在,好花常开。

IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:北京市
  • 加入CSDN时间: 2021-10-03
博客简介:

这个人很懒,什么都没有写

查看详细资料
个人成就
  • 获得8次点赞
  • 内容获得1次评论
  • 获得12次收藏
创作历程
  • 34篇
    2023年
  • 15篇
    2022年
成就勋章
兴趣领域 设置
  • Java
    javaspringspring bootjvmservletmybatis
  • 数据结构与算法
    算法数据结构链表贪心算法动态规划排序算法leetcodeb树散列表宽度优先广度优先深度优先迭代加深图搜索算法霍夫曼树哈希算法
  • 后端
    mvcmysqltomcat后端
创作活动更多

HarmonyOS开发者社区有奖征文来啦!

用文字记录下您与HarmonyOS的故事。参与活动,还有机会赢奖,快来加入我们吧!

0人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

jvm实现的锁优化

轻量级锁在无竞争的情况下对于每次的加锁请求都使用CAS来避免了互斥量的使用,而偏向锁就是在无竞争的情况下连CAS都不用做了(只是在线程第一次获取偏向锁的时候使用了CAS),通过判断Mark Word中的ThreadID是不是当前线程即可,如不是,则进行重偏向即可。但如果存在锁竞争,那么除了互斥量的开销外,还额外发生了CAS的开销。,那轻量级锁就不再有效,必须要膨胀为重量级锁,锁标志转变为“10”,此时Mark Word 就不再存储锁记录的指针了,而是存储重量级锁互斥量(monitor对象)的指针了。
原创
发布博客 2023.10.19 ·
580 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

如何实现线程安全?

简单描述一下线程安全问题:在程序并发执行的过程中,对于临界区的一些共享数据,可能同时会有多个线程对其进行修改,造成数据覆盖、脏读等一系列问题如何实现线程安全?首先想到的就是实现线程同步,让并发线程同步执行,保证共享的数据在同一时刻只能被一个线程使用。
原创
发布博客 2023.10.18 ·
309 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

经典垃圾回收器

由于最后的垃圾清除也是用户线程和垃圾收集线程并发运行,所以用户线程再这一时间段内也会产生垃圾,这些垃圾成为“浮动垃圾”,用于并发标记阶段已结束,只能等到下一次GC时进行标记收集。最后用于线程和垃圾收集线程之所以能并发运行的原因也是因为CMS 是基于标记-清除算法实现的,不会涉及到对象的移动。像标记-整理算法涉及到对象的移动,必须进行STW.
原创
发布博客 2023.09.27 ·
328 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

为什么wait()要在synchronized块中执行

wait() 方法还没有执行完,notify() / notifyAll() 方法已经执行完,这样 notify() / notifyAll() 就进行了一次空唤醒操作,而 wait() 执行完后由于再没有notify() / notifyAll()的唤醒,会导致wait() 所在线程一直阻塞。ReentrantLock它实现同步/互斥并不会涉及到 monitor,所以 不能用 ReentrantLock 这种可重入锁来实现互斥配合 wait()、notify()、notiryAll()。
原创
发布博客 2023.09.21 ·
819 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

I/O多路复用-redis单线程模型快的根本原因

发起请求的一方需要等待操作完成并获得结果后才能继续执行后续的操作,换句话说,同步操作会阻塞当前线程或进程,直到操作完成。:发起请求的一方可以继续执行后续的操作,而不必等待操作完成。异步操作通常会使用回调函数、事件处理器或者轮询的方式来处理结果。在异步模式下,不同的参与方可以独立地进行操作,无需等待其他操作的完成。:在阻塞模式下,当一个I/O操作被调用时,程序会一直等待,直到操作完成或者发生错误才会返回结果。在阻塞状态下,调用线程或进程会被挂起,无法进行其他任务,直到I/O操作完成或者超时。
原创
发布博客 2023.07.16 ·
367 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Redis持久化(RDB和AOF)

Redis是基于内存数据库,宕机后和数据会消失,当Redis用作DB 时,DB数据要完整,所以一定要有一个完整的数据源文件,在系统启动时,从这个完整的数据源中将数据load到 Redis内存中,完成提供持久化机制。:RDB、AOF、RDB-AOF混合持久化RDB:在指定的时间间隔内,形成当前数据集的时间点快照。将快照信息保存到磁盘的RDB文件中。在redis.conf中有如下配置,配置 save 参数即可自动触发rdb,一般RDB快照信息保存在dump.rdb文件中,文件名可以修改。432 #
原创
发布博客 2023.07.15 ·
164 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

布隆过滤器BloomFilter原理及使用场景

对redis每一个 key 经过 hash 取值,将 hashCode 对bitmap 的长度 2^32 取余,得到 hashCde 在bitmap 中对应的索引位置,没了减少hash碰撞,我们通常对同一个 key 进行多次hash,得到多个 hashCode ,在 bitmap 中用多个位置标志一个key。这样也就造成了布隆过滤器的删除问题。因为布隆过滤器的每一个bit位并不是独占的,很可能多个元素共享了某一位,如果我们直接直接删除了某一位元素,会影响其他的元素。:(此案例只用了一次hash)
原创
发布博客 2023.07.14 ·
264 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

二叉树的Morris遍历

利用叶子节点的left , right 这些空指针,使得非叶子节点能够借助这些空指针遍历两次,没有使用额外的空间。前中后遍历都是在第一次 / 第二次 的遍历过程中做不同的处理。Morris遍历可以将非递归遍历中的空间复杂度降为O(1)。从而实现时间复杂度为O(N),而空间复杂度为O(1)的精妙算法。对于没有左子树的节点之遍历一次,有左子树的节点遍历两次。:记作当前节点为cur。
原创
发布博客 2023.07.13 ·
253 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Redis中的bigKey问题

对于bigkey的判定标准,《阿里云redis开发规范》中规定了:对于String类型value,value占用空间大于10kb,对于list,hash,set,zset类型若元素个数超过5000,就算bigkey。scan命令:是一个基于游标的迭代器, 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。① 超时删除,对于大key,删除是及其耗时的,由于redis命令的执行是单线程的,删除大key会导致主进程阻塞影响性能。
原创
发布博客 2023.07.13 ·
773 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

并查集(java详细实现)

查询两个元素是否在同一个集合中,以及合并两个不相交集合。当然我们可以用链表等其他数据结构来实现,担当数据量特别大的时候,使用链表是非常耗时的,采用并查集结构可以大大提高合并及查询的效率。初始化并查集时,我们将每一个元素的根节点都指向自己。根节点,下文成为 “ 代表节点 ”:并查集也是一种树的结构,
原创
发布博客 2023.07.12 ·
681 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

数据结构与算法-前缀树(字典树)

前缀树的结构是一个多叉树,每个节点代表一个字符,从根节点到叶子节点的路径表示一个字符串。根节点没有相应的字符,而其他节点表示字符集中的一个字符。每个节点可能有多个子节点,每个节点代表一个字符的可能取值。能够高效的支持字符串的插入、搜索和前缀匹配操作,经常用于搜索引擎、拼写检查、自动完成和单词查找等场景。我们用 pass 标记当前节点有多少个字符串经过, 用 end 标记当前节点是多少字符串的结束字符,就最后一个字符。空间换时间,利用字符串的公共前缀来降低查询时间,不同的公共前缀之保存一份。
原创
发布博客 2023.07.11 ·
474 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

“最多可以参加的会议数目”

首先需要按照起始时间对 events 数组进行升序排列,使得起始时间相同的会议放在一起,避免后面在统计当天为起始时间的会议时,每统计一天,都要对 events 数组进行遍历。排序后,我们可以维护一个变量,遍历并标记 events 的位置,使得 events 在统计完所有天的会议后之遍历一遍。过期会议:可能已经有未排的会议的结束时间在当天之前,这时我们需要将过期会议的结束时间从小顶堆中移除。大白画:统计当天为起始时间的所有会议,选取其中结束时间最早的那个会议。注意,一天只能参加一个会议。
原创
发布博客 2023.06.06 ·
234 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

二叉树最近公共祖先

题目:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(3节点5和节点1的最近公共祖先是节点3。
原创
发布博客 2023.05.14 ·
117 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

求二叉树的最大宽度

使用层序遍历二叉树(DFS)来求解的化,就必须要处理 null 节点带来的问题,因为我们要借助队列 (Queue) 这一数据结构来实现 DFS ,就要处理 队列 不能加添 null 节点的问题。所以如果要使用队列的话,就不能通过每层的队列中的节点数来统计每层的宽度,这样会忽略每层的null 节点。那用什么数据结构来存储每个节点对应编号呢,第一反应就是哈希表,但是哈希表是无序的,这样每一层做减法就不能得到正确的宽度,java 中提供了一种类似哈希表的一种数据结构 Pair。给你一棵二叉树的根节点。
原创
发布博客 2023.05.11 ·
726 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

两个单链表相交问题(有环、无环)

给定两个可能有环也可能无环的单链表,头节点head1和head2,请实现一个函数,如果两个链表相交,返回相交的第一个节点,如果不相交,返回 null。
原创
发布博客 2023.04.26 ·
197 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

复制含有随机指针节点的链表

题目描述:一种特殊的单链表节点类描述如下class Nodeint value;Node next;Node rand;rand指针是单链表节点结构中新增的指针,rand可能指向链表中的任意一个节点,也可能指向null。给定一个由Node节点类型组成的无环单链表的头节点head,请实现一个函数完成这个链表的复制,并返回复制的新链表的头节点。
原创
发布博客 2023.04.24 ·
142 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

回文链表三种解法

题目描述:给定一个链表的head请判断其是否为回文链表。如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。例如:[1,2,3,3,2,1] 是回文。
原创
发布博客 2023.04.19 ·
155 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

堆排序记录

给出一个数组 arr [2,3,4,6,3,1],要把它构建成一个堆结构来实现排序,怎么做呢?我们可以对数组的索引操作,将其变成一个堆结构,例如:arr [0] 作为父节点(堆顶)那么 arr [1] 和arr [2] 就是其左右子节点,也就是 arr [i] 的左右子节点 就是arr [ 2 * i + 1] 和 arr [ 2 * i + 2](arr 可以看作是 2 为根节点的二叉树的层序遍历的结果)简单记录:堆排序顾名思义,借助堆结构来实现排序。heapInsert 过程可以理解为。
原创
发布博客 2023.04.18 ·
57 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

荷兰国旗问题 、快排

可是上述快排的时间复杂度是O(N^2),导致N^2的原因是我们每次都默认nums的最后一个数作为划分,这样我们可以人为 的使数组进行两次递归时的权重严重失衡,使得成为了N^2的算法,我们只要使每次的划分值的选取是一个随机事件,最终的时间复杂度就降到了O(NlogN),(具体证明过于复杂,这里不做证明,给出传送门>>>问题:给定一个数组nums,和一个数n,请把小于n的数放在数组的左边,等于n的数放在数组的中间,大于n的数放在数组的右边。,因为它左边全是小于它的数,右边全是大于它的数。这也就是快排的过程。
原创
发布博客 2023.04.12 ·
107 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

小和问题(基于归并排序实现)

最简单暴力的解法就是遍历每一个元素之前的元素,并记录每一个小和,最后相加得出整个数组的小和,这样毫无疑问是O(n^2)的时间复杂度。,当左组的元素小于右组的某一元素后,这是我们就不用再继续拿左组的这个元素继续在右组中进行遍历比较,因为右组已经有序了,只需要 r - p2 + 1即可。在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。小和定义:每一个数左边比当前数小的数累加起来,叫做这个数组的小和。我们为什么要进行排序呢,由上图可以看出,比如:[1,3,4,2,5]求小和。
原创
发布博客 2023.04.11 ·
79 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏
加载更多