自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

冯宝宝

天下熙熙天下攘攘

  • 博客(83)
  • 资源 (3)
  • 收藏
  • 关注

原创 关于泛型方法重写的问题--继承/重写/泛型

第二张图中的抽象类实现了图1 中的泛型接口;其中图2中的handler方法重写图1中的接口方法是没有问题的,但是图2中的next泛型方法指定类型重写图1中的泛型方法next却是有问题的,为什么?

2023-11-25 23:27:32 474

原创 JVM核心原理解读(一)---执行引擎

Java虚拟机规范制定了Java字节码执行引擎的概念模型,Java执行引擎作用概括起来就是执行编译产生的Java class文件,为用户提供了底层OS的调用,屏蔽了不同平台硬件和OS的差异性,使得编写的代码无差别的在各个平台运行;

2023-08-24 13:11:36 606

原创 Netty核心源码解析(三)--NioEventLoop

首先,一个NioEventLoop聚合一个selector对象,这个selector对象就是JDK NIO中的selector对象(Netty可以配置选择是否对JDK 中的selector优化,优化主要是对selectionkeys集合优化,后续详细解释),通过代码可以看到,NioEventLoop的构造器里完成了selector的创建----(具体的selector创建Netty通过继承了jdk的SelectorProvider来实现的)至此,一次Eventloop循环就处理完了,总结一下---

2023-08-23 20:14:20 542

原创 JCTools Mpsc源码详解(二) MpscArrayQueue

MpscArrayQueue是一个固定大小的环形数组队列,继承自ConcurrentCircularArrayQueue。看一下MpscArrayQueue的属性(填充类除外)---首先看一下offer方法。

2023-08-22 12:49:16 239

原创 JCTools Mpsc源码详解(一)

可以看出Jctools提供八种Mpsc的具体实现分别针对不同的生产者消费者场景,Jctools提供的Mpscqueue高性能的主要原因是文章开始提到的几种方案,以及对应的具体实现的一些优化技巧,本身使用还是基本的队列操作,屏蔽了底层的实现细节,具体分析几种经典的实现;伪共享问题只发生在不同线程对同一cacheline中的不同变量访问的情况下---如果多个线程对同一个变量使用那就必须每次做同步操作,另外如果多个变量存在于不同的cacheline中的话也不存在伪共享问题。具体的Mpsc实现看后续的文章;

2023-08-21 14:25:26 482

原创 Netty核心源码解析(二)--ServerBootstrap启动过程

这里重点看一点initAndRegister()方法中的init()方法,这个方法就是为serversocketchannel添加相关的处理器,而serversocketchannel的主要处理逻辑就是监听端口,将新的连接请求分发到workerGroup的EventLoop上,先来看一下代码--介绍--dobind0()方法这里其实已经完成了serversocketchannel的创建初始化,dobind0()方法基本上可以启动线程开始监听端口了;先来看一下initAndRegister()方法--

2023-08-18 09:23:43 119

原创 阿里社招一面记录

最后:面试官说今天的面试也一个多小时了,就到这里先,也没有反问环节就直接结束了,面完一个半多小时了,经历的单次最长的面试,乘着热乎记录一下,可能不完全,但是大差不差;一轮电话面试,一个半小时,昨天晚上面试的,今早面试官打电话约了二面(为啥是一面面试官:)

2023-08-15 13:58:28 446

原创 ThreadLocal源码解析

另外需要注意的是,对ThreadLocal 保存的线程变量一定要在使用完之后及时remove掉,一个原因是防止内存泄漏,更重要的原因是在线程池场景下,一个请求可能会读取到上一个请求保存的变量内容,从而造成业务逻辑上的BUG,而且这种BUG还是不易排查的;上边的调用关系可以看出来基本上我们对ThreadLocal的get,set,remove操作都会触发清理工作,尽量减小了内存泄漏带来的影响---在未做任何操作之前不会主动触发清理,所以在使用ThreadLocal的时候及时调用remove很重要!

2023-08-15 03:32:22 232

原创 Netty核心源码解析(一)

【代码】Netty核心源码解析(一)

2023-08-13 14:26:36 146

原创 分布式异步任务处理组件(八)

这里一个selector可以处理多个Socket连接的多个事件,但是selector本身的设计实现是同步模式的,多线程读取selector中的事件需要阻塞,也就是说同一时刻只能有一个线程读取selector中的事件并消费;如果有多个线程同时监听selector中的事件未获取到锁的线程只能阻塞,所以这里对一个selector对象只使用一个线程处理IO事件(读写可以分开为两个事件);相对应的,对同一个读写队列也只使用一个线程来处理--但是这里读写队列是分开的;首先说一下线程拆分的原则--初期线程模型设计--

2023-08-07 03:04:06 811

原创 分布式异步任务处理组件(七)

【代码】分布式异步任务处理组件(七)

2023-08-04 14:39:05 884

原创 分布式异步任务处理组件(五)

如何保证一个消息只会被执行一次---从几个方面保证--一个消息最多可能存在于两个节点中(除非多个节点都在执行消息的时候失败,这种概率是很小的),消息出现在其他节点中的情况--partition重分配,则该节点执行队列中的消息可能被其他节点消费,但是只会进入到其他节点的存疑队列中,而不是直接被执行,存疑队列通过举证和执行检查策略保证该消息没有即将被执行或者正在被执行或者最终被执行完成;可以不和kafka断开连接的原因是此时自己和kafka的消息不回被其他节点消费,所以执行队列中的任务可以正常执行并提交;

2023-07-31 15:36:00 492

原创 分布式异步任务处理组件(三)

集群状态一致性维护。

2023-07-31 15:35:38 79

原创 分布式异步任务处理组件(四)

基于zookeeper的HA集群设计思路--消息最多可能存在两个节点中--

2023-07-30 23:20:42 837

原创 分布式异步任务处理组件(二)

一些关键点的设计和思考----very import!

2023-07-27 02:52:25 1554

原创 Redis过期策略和内存淘汰策略

内存淘汰是指当内存使用量超过了配置的maxmemory时,自动触发对Redis内存的回收,无论key是否过期或者key是否设置了过期时间,跟具体的淘汰策略有关,只是为了释放内存保证Redis的正常运行;定期删除时并不会实际对key做全量扫描,而是随机抽取固定数量的设置了过期时间的key,如果样本中已经过期的key比例超过25%,则清除这些key并重新随机抽取,直到样本中过期的key的比例小于25%过期策略是指Redis设置过期时间且key已经到达过期时间时删除该key,一般有定期删除和惰性删除;

2023-07-25 16:13:12 196

原创 算法--LRU缓存实现

【代码】算法--LRU缓存实现。

2023-07-25 16:03:18 170

原创 Redis

写时复制技术:当RDB进行时候,如果对某个key进行修改,则主进程会将被修改key所在的页拷贝一份,然后对该拷贝的副本进行修改,RDB备份的任然是备份开始前的数据;负载因子,redis中rehash是由主线程完成的,为了避免主线程阻塞时间过长,Redis每次在数据访问的时候进行rehash操作,并记录当前rehash的索引保持进度;AOF重写时如果发生数据修改,则将修改命令记录在aof_rewrite_buff中,当AOF重写完成之后才会追加到新的AOF文件中;redlock原理--

2023-07-16 22:39:36 339

原创 Java基础-- Synchronized详解

轻量级锁适用于多个线程无竞争执行同步代码块,使用cas操作(循环等待)避免进入内核态(线程阻塞唤醒操操作)即可完成线程串行执行。Java中传统意义上锁的实现有两种-- Synchronized 以及reenterantlock。jvm层面对锁机制做了一些优化--重量级锁适用于多个线程实际竞争,保证并发同步,但是synchronized是非公平锁;偏向锁适用于单独线程执行同步代码,无竞争情况下不需要频繁加锁解锁。偏向锁->轻量级锁->重量级锁。synchronized实现原理--多线程同步依赖于锁机制;

2023-07-14 15:18:55 205

原创 Java基础--集合

反观长度16或者其他2的幂,length - 1的值是所有二进制位全为1,这种情况下,index的结果等同于hashcode后几位的值,只要输入的hashcode本身分布均匀,hash算法的结果就是均匀的。扩容时创建一个新的长度为原来两倍的数组,然后对原来的hashmap中的元素进行rehash,计算出新的数组下标--可能会发生变化。扩容时增加5的容量;cas--读取的时候不加锁,在写入的时候比较原值是否被修改,和读取到的值不同则写入失败;--hashmap的扩容机制--默认负载因子为0.75;

2023-07-13 16:01:27 186

原创 为什么重写equals方法一定要重写hashcode方法

结论——不是重写equals方法就一定要重写hashcode方法,而是要保持一个规范——equals方法相等时要保证hashcode方法相等,hashcode不相等一定要保证equals方法不相等;原因--hashset或者hashmap中,如果计算hash code不相同的对象equals方法相同,就相当于把相同的对象插入了set中,违反了set的语义;实现自定义字符串类,重写equals方法,但不重写hashcode方法---hashcode方法继承Object类;

2023-07-12 16:56:27 165

原创 层序遍历二叉树并输出到二维数组中

【代码】层序遍历二叉树并输出到二维数组中。

2023-07-10 18:56:58 132

原创 堆排序-递归实现和非递归实现

【代码】堆排序-递归实现和非递归实现。

2023-07-04 00:26:43 119

原创 SpringBoot启动流程和自动配置实现原理

@SpringBootApplication+run()方法--加载一个应用所需要的所有资源和配置,最后启动一个应用实例;run()方法--public ConfigurableApplicationContext run(String... args)run()方法主要创建一个应用上下文实例(应用上下文其实就是一个SpringBean工厂),这里具体的是创建了一个ConfigurableApplicationContext实例;而Spring工厂的创建需要注册相应的beandefinit

2021-11-24 20:36:57 384 1

原创 最长回文子串

import java.util.*;public class Solution { public int getLongestPalindrome(String A) { int n=A.length(); // write code here int[][]result =new int[n][n]; int[][]r=doget(result,A,0,n); int rse=0; .

2021-11-19 17:39:00 401

原创 重排链表Java

将给定的单链表\ LL:L_0→L_1→…→L_{n-1}→L_ nL0​→L1​→…→Ln−1​→Ln​重新排序为:L_0→L_n →L_1→L_{n-1}→L_2→L_{n-2}→…L0​→Ln​→L1​→Ln−1​→L2​→Ln−2​→…要求使用原地算法,不能只改变节点内部的值,需要对实际的节点进行交换。数据范围:链表长度0 \le n \le 200000≤n≤20000,链表中每个节点的值满足0 \le val \le 10000≤val≤1000要求:空间复杂度O(n)...

2021-11-15 18:38:53 561

原创 有重复项所有数字的排列

描述给出一组可能包含重复项的数字,返回该组数字的所有排列。结果以字典序升序排列。数据范围:0 < n \le 80<n≤8,数组中的值满足-1 \le val \le 5−1≤val≤5要求:空间复杂度O(n!)O(n!),时间复杂度O(n!)O(n!)示例1输入:[1,1,2]复制返回值:[[1,1,2],[1,2,1],[2,1,1]]复制示例2输入:[0,1]复制返回值:[[0,1],[1,0]]impor...

2021-11-15 18:29:52 317

原创 二叉树中和为某一值的所有路径

描述输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点2.叶子节点是指没有子节点的节点3.路径只能从父节点到子节点,不能从子节点到父节点4.总节点数目为n如二叉树root为{10,5,12,4,7},expectNumber为22则合法路径有[[10,5,7],[10,12]]数据范围:树中节点总数在范围[0, 5000.

2021-11-15 18:27:16 310

原创 寻找第K大的数

描述有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数。给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在。要求:时间复杂度O(nlogn)O(nlogn),空间复杂度O(1)O(1)数据范围:0\le n \le 10000≤n≤1000,1 \le K \le n1≤K≤n,数组中每个元素满足0 \le val \le 100000000≤val≤10000000示例1输入:[1,3...

2021-11-15 18:25:50 142

原创 有重复元素的二分查找

描述请实现有重复数字的升序数组的二分查找给定一个 元素有序的(升序)长度为n的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返回下标,否则返回 -1进阶:时间复杂度,空间复杂度示例1输入:[1,2,4,4,5],4复制返回值:2复制说明:从左到右,查找到第1个为4的,下标为2,返回2 示例2输入:[1,2,4,4,5],3复制返回值:-1复制示例.

2021-11-15 18:23:32 818

原创 用两个栈实现队列

描述用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。数据范围:n\le1000n≤1000要求:存储n个元素的空间复杂度为O(n)O(n),插入与删除的时间复杂度都是O(1)O(1)示例1输入:["PSH1","PSH2","POP","POP"]复制返回值:1,2复制说明:"PSH1":代表将1插入队...

2021-11-15 18:21:47 131

原创 判断链表是否有环

描述判断给定的链表中是否有环。如果有环则返回true,否则返回false。数据范围:链表长度0 \le n \le 100000≤n≤10000,链表中任意节点的值满足|val| <= 100000∣val∣<=100000要求:空间复杂度O(1)O(1),时间复杂度O(n)O(n)输入分为2部分,第一部分为链表,第二部分代表是否有环,然后回组成head头结点传入到函数里面。-1代表无环,其他的数字代表有环,这些参数解释仅仅是为了方便读者自测调试。实际在编码时...

2021-11-15 18:20:07 123

原创 力扣翻转链表

描述给定一个单链表的头结点pHead,长度为n,反转该链表后,返回新链表的表头。数据范围:n\leq1000n≤1000要求:空间复杂度O(1)O(1),时间复杂度O(n)O(n)。如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。以上转换过程如下图所示:示例1输入:{1,2,3}复制返回值:{3,2,1}复制示例2输入:{}复制返回值:{}复制说明:空...

2021-11-15 18:18:52 133

原创 有重复数字项的所有排列

描述给出一组可能包含重复项的数字,返回该组数字的所有排列。结果以字典序升序排列。数据范围:0 < n \le 80<n≤8,数组中的值满足-1 \le val \le 5−1≤val≤5要求:空间复杂度O(n!)O(n!),时间复杂度O(n!)O(n!)示例1输入:[1,1,2]返回值:[[1,1,2],[1,2,1],[2,1,1]]示例2输入:[0,1]返回值:[[0,1],[1,0]]import java.u...

2021-11-15 01:54:42 257

原创 2048的最小合成次数

■题目描述有一个数字游戏叫做2048,此游戏的规则为,两个相同的数字能进行相加。例如:两个2可以相加,则相加后4的个数加一,2的个数会减二。现在有一串数字,为目前已知的数字的数量。问至少还需要几次相加,才能获得2048 (题目保证能够相加得到2048)。输入描述:第一行为样例数T,代表后面会跟随工组测试数据。每组测试数据输入10个数,分别代表2,4,8,16,32,64,128,256,512,1024的个数。每种数字的个数不超过1024。输出描述:对于每组数据, 输出一个数, 表示需要得

2021-11-14 22:24:00 729

原创 在二叉树中找到两个节点的最近公共祖先

描述给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1和o2,请找到 o1和o2的最近公共祖先节点。数据范围:1 \le n \le 10001≤n≤1000,树上每个节点的val满足0<val \le 1000<val≤100要求:空间复杂度O(1)O(1),时间复杂度O(n)O(n)注:本题保证二叉树中每个节点的val值均不相同。如当输入[3,5,1,6,2,0,8,#,#,7,4],5,1时,二叉树{3,5,1,6,2,0,...

2021-11-13 20:59:59 394

原创 SpringIOC源码分析

bean的生命周期 循环依赖 三级缓存 factorybena和benafactoey appliaationcontext和beanfactory的区别 ioc容器bean——数据结构——map——三级缓存IOC容器context.getBean()——什么时候调用容器中如何创建bean——工厂,反射——配置文件(xml)Spring如何加载配置文件到应用中的——new classpathxmlapplocationContext(”beans.xml“)——不同的配置文件

2021-11-12 01:15:52 604

原创 终于搞明白了Mysql的两段提交

废话不多说:MySQL的两段提交是为了redo_log和bin_log的数据一致,首先看一下什么是redolog和binlogMySQL架构分为服务层和存储引擎层,binlog是服务层的日志,redolog是引擎层的日志,MySQL使用redolog来实现WAL,也就是每次有数据更新操作的时候首先记录在内存中的redolog中,然后后台写盘,减少磁盘IO次数,提高并发量和响应能力;redolog和binlog的区别redolog记录的是存储引擎级别物理磁盘的变化,使用循环队列的方式写入,

2021-11-07 18:36:22 68

原创 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: s = "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"...

2021-10-30 17:59:48 162

原创 Java的多线程

什么是线程线程是一种轻量级进程,线程和进程的区别在于进程是操作系统独立分配资源(这里的资源可以粗略的理解为内存)的最小单位,而线程是执行任务的最小单位,线程共享内存资源,但是独立执行任务;这里的最好理解可以看一下计算机操作系统演变过程中的进程的演变过程;当一个进程下的多个线程同时工作,共享内存资源的时候就出现了并发环境下的数据同步问题;如何保证多个线程在对共享数据进行操作的时候不会出现并发问题就是多线程所要解决的问题,Java提供了一系列同步手段来在保证效率的情况下实现多线程之间的数据同步问题;

2021-10-22 15:22:48 218

chrome小恐龙游戏图片资源

chrome小恐龙游戏图片资源,对应代码在个人csdn博客中。。。。欢迎大家下载 https://blog.csdn.net/qq_42468130/article/details/88960648#comments

2019-12-10

springsecurity原理流程图.pdf

SpringSecurity框架的权限认证流程原理,请求到来时SpringSecurity如果调用层层过滤器来完成认证;

2019-09-08

SpringSecurity框架原理.png

该图是作者在分析SpringSecurity框架源代码之后梳理出来的Spring Security框架得启动原理图,即SpringSecurity是如何获取过滤器参数配置并调用相应的过滤器的;

2019-09-08

空空如也

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

TA关注的人

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