自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

闲来也无事

日常随笔,源码解析

  • 博客(53)
  • 资源 (2)
  • 收藏
  • 关注

原创 高频面试Java之线程池

简介本专栏结合笔者面试的一些高频率题目,详细分析其原理、场景、底层机制、以及实际场景等。为了节约篇幅,我们注重分析一些原理、较为底层的东西,对于一些概念性的知识,不多赘述。也希望通过这个专栏,让大家在面试的过程中能够灵活应对。早日收到满意的offer关于线程池的一些概念,如线程池是什么、为什么要使用线程池,不多赘述。1、为什么不推荐使用Executors线程池的创建方式有很多种,这也是面试最常问的问题,归根结底,面试官还是为了考察线程池的参数含义。不推荐使用 Executors的原因是默认参数不友好

2021-09-01 19:04:53 2510 1

原创 Spring源码IOC之无参实例化策略

无参实例化策略2.6 无参实例化策略2.6.1 getInstantiationStrategy 获取实例化策略2.6.2 实例化策略概览2.6.3 反射2.6.4 CGLIB2.6 无参实例化策略上文提到了IOC实例化bean的几种策略,接下来的小节,重点分析无参、有参两种实例化策略。因为无参策略较为简单,所以先分析该策略。入口代码:// 获取实例化策略,并实例化beanbeanInstance = getInstantiationStrategy().instantiate(mbd, bean

2021-10-06 00:10:47 244

原创 HttpURLConnection Get 转 Post 解决

HttpURLConnection 设置setDoOutput(true)后,GET转POST// 错误示例connection.setDoOutput(true);OutputStream outputStream = connection.getOutputStream();DataOutputStream out = new DataOutputStream(outputStream);out.flush();out.close(); connection.g

2021-09-27 20:05:14 574

原创 努力到500

2021-09-21 11:00:11 164

原创 Redis6.0源码阅读环境搭建

Redis6.0源码阅读环境搭建文章目录Redis6.0源码阅读环境搭建1、环境2、检出代码3、修改CMakeLists.txt文件3.1、redis3.2、src/modules3.3、deps3.4、deps/lua3.5、deps/linenoise4、构建并运行代码1、环境macClion 2021.2.22、检出代码代码地址直接在Clion通过git插件检出即可切换到6.0分支3、修改CMakeLists.txt文件分别在下面给出的目录下新建CMakeLists.txt

2021-09-20 15:53:07 2308

原创 开发常用设置

IDEA 日志快捷键找到Live Templates,新建模板log.info("$desc$, $params1$", $params2$);params1:groovyScript(" def result=''; def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList(); for(i = 0; i < params.size(); i++) { result+=''+param

2021-09-17 19:56:08 2377

原创 Gradle项目国内镜像

打开build.gradle,找到repositories,覆盖:repositories { mavenCentral() maven { url "https://maven.aliyun.com/repository/public" } maven { url "https://maven.aliyun.com/repository/spring-plugin" } maven { url "https://repo.spring.io/libs-spring-framework-build

2021-09-13 23:42:40 2451

原创 Spring源码IOC之实例化Bean的方式

2.4 doCreateBean 概览经过了前面的一系列准备,接下来进入IOC的核心方法doCreateBean。中间涉及较多的知识点,分多个小节分析,下面先来了解一下doCreateBean的主要逻辑。protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { // Instantiate the bea

2021-09-13 23:37:50 4595

原创 Spring源码IOC之创建Bean的前置工作

文章目录2.3 创建bean的实例--前置准备工作2.3.1 getSingleton2.3.1.1 beforeSingletonCreation 前置处理2.3.1.2 afterSingletonCreation 后置处理2.3.1.3 addSingleton 缓存bean实例2.3.2 createBean2.3.1 RootBeanDefinition 简介2.3.2 prepareMethodOverrides2.3 创建bean的实例–前置准备工作Spring Bean的作用域有:p

2021-09-13 00:10:21 2919

原创 Spring源码之@Component 注解

文章目录2.2 从缓存中获取bean实例2.2 从缓存中获取bean实例针对单例bean,IOC会缓存bean的实例信息,在doGetBean方法中有:// 从缓存中获取bean实例Object sharedInstance = getSingleton(beanName);单例bean的实例信息被缓存在了:// 缓存bean的实例信息private final Map<String, Object> singletonObjects = new ConcurrentHa

2021-09-12 19:35:26 2814

原创 Spring源码之IOC

文章目录2. IOC2.1 IOC 相关概念2.2 测试样例2. IOC2.1 IOC 相关概念作用:控制反转依赖注入bean 作用域prototypesingletonrequestsessionglobal session生命周期,可以理解为在创建、使用、销毁bean的时候,需要调用的方法,依次为BeanNameAwareBeanFactoryAwareApplicationContextAwarePostConstructInitializingBea

2021-09-12 01:18:17 2662

原创 Spring源码阅读环境搭建

文章目录第一章 Spring知识点回顾1. 搭建Spring源码阅读环境1.1 环境1.2 源码下载1.3 更改repositories1.5 构建源码并运行测试第一章 Spring知识点回顾1. 搭建Spring源码阅读环境1.1 环境JDK1.8IDEA 2021.2Spring 最新版1.2 源码下载通过IDEA检出代码:https://github.com/spring-projects/spring-framework.git。切换分支:git checkout -b

2021-09-12 00:01:56 2628

原创 SpringCloud之Ribbon

1、通过RestTemplate开启负载均衡新增Configuration配置类,创建RestTemplate实例并通过@LoadBalanced开启负载均衡。@Configurationpublic class RestTemplateConfig { @Bean @LoadBalanced protected RestTemplate restTemplate() { return new RestTemplate(); }}@LoadBala

2021-09-11 11:21:54 239

原创 SpringCloud之EurekaClient

EurekaClient 确定源码分析入口// 程序启动主函数@EnableEurekaClient@SpringBootApplicationpublic class Provider01Application {public static void main(String[] args) { SpringApplication.run(Provider01Application.class, args);}}// EnableEurekaClient注解@Target(E.

2021-09-11 11:18:56 974

原创 SpringCloud之EurekaServer

1. EurekaServer启动过程@EnableEurekaServer@SpringBootApplicationpublic class Service01Application { public static void main(String[] args) { SpringApplication.run(Service01Application.class, args); }}通过@EnableEurekaServer注解开启EurekaServer配置,下面我们通过注解一步

2021-09-11 11:16:45 424

原创 Git配置多个多个账号

1、生成ssh-key针对不同的git地址,生成不同名称的的rsa文件ssh-keygen -t rsa -C "[email protected]" -f ~/.ssh/xiangxindai-rsa2、在~/.ssh目录下添加config配置文件用于区分多个SSH-Key# 第一个Git配置Host git.xs.jfHostName git.xs.jfPreferredAuthentications publickeyIdentityFile ~/.ssh/sanwen

2021-09-11 10:37:54 2729

原创 高频面试MySQL之索引、查询优化

1、简介索引和查询优化是面试比不可少的环节,下面针对B+Tree做一些常见的面试点的分析,从建表、索引、查询三个方面分析。2、数据库和表设计从大的设计原则上,可以考虑分库分表,读写分离,使单表数据不会太大,同时流量分散到不同数据库实例上,减轻数据库压力字段数据类型选择:1)选择占用空间较小的数据类型,使用定长代替变长,如使用unsigned tinyint、smallint代替int;2)对于布尔、枚举类型的字段,使用char(1) 来代替;3)分离text、blob等类型的字段;4)避免单表字段

2021-09-03 10:16:43 2258

原创 高频面试Redis之哨兵

简介Sentinel 机制,用于当主节点出现故障时,自动完成故障发现、故障转移等操作,保证 redis 的高可用性。2、 监控与故障发现Sentinel 通过 pub/sub 机制、以及定时任务实现:监控主从拓扑信息:每隔10秒,Sentinel 向 master、slave发送 INFO 命令获取最新的拓扑结构Sentinel 节点信息交换:每隔 2 秒,Sentinel 向 redis 数据节点的 sentinel:hello 频道上,发送自身的信息,以及对主节点的判断信息。这样,Sent

2021-09-03 10:09:12 2333

原创 高频面试Redis之复制

1、简介适用于 Master/Slave 模式,提高redis的可用性,提高对并发读写的支持。建立:可通过配置文件、命令行、启动命令参数实现,根式均为slaveof {masterHost} {masterPort};断开:从节点执行 slaveof no one。有全量复制和增量复制两种场景。2、全量复制最常见的场景,slave第一次连接到master,则触发全量复制master 节点收到 slave节点的 psync 命令后执行 bgsave 命令,在后台生成RDB文件,同时将从现在开始执行的

2021-09-02 14:44:57 2222

原创 高频面试Redis之持久化

1、简介Redis的持久化方式有两种,AOF、RDB2、RDB 持久化RDB 触发方式有两种:save、bgsave,redis主进程接收到命令后fork子进程负责持久化redis主进程判断当前是否存在正在执行的子进程,如RDB、AOF子进程,若存在则直接返回;若不存在fork子进程,这时候主进程会被阻塞主进程fork完成后,返回Background saving started,并恢复主进程子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换子进程发送信号通知

2021-09-02 14:38:59 2303

原创 高频面试Redis之分布式锁

1、简介Redis实现分布式锁的方式有很多,可借助setnx、lua等方式实现。但是现实往往要考虑更多的问题。如超时时间、可重入、加锁形式、锁的安全释放、锁的自动延期等等。所以我们重点分析Redssion的分布式锁实现。2、Redssion 加锁加锁的过程如下,代码均有注释。解锁过程与之相反,不一一赘述。// 加锁过程:// 执行exists命令,判断对应的lockName是否存在,如果key不存在"if (redis.call('exists', keyS[1]) == 0) then " +

2021-09-02 14:35:34 2253

原创 高频面试Redis之签到、限流

1、简介面试环节,面试官往往会结合一些实际的场景,下面通过分析redis的签到、限流两个最常见的场景。2、签到位图,本质string,可理解为byte数组,利用 0、1 标识是否签到。节约内存空间(46字节365天)// 按月签到 setbit key offset(偏移量,0:1号,1:2号) value(1:签到;0:未签到)setbit u:sign:1000:202101 0 1 // 1月1号签到 setbit u:sign:1000:202101 1 1 // 1月2号签到

2021-09-02 14:29:11 2321

原创 高频面试Redis之数据结构

1、简介Redis的数据结构有五种:string、hash、list、set、zset2、内部编码及场景stringint:8个字节的长整型;embstr:小于等于44个字节的字符串;raw:大于44个字节的字符串优点:常数复杂度获取字符串长度、杜绝缓冲区溢出、减少字符串修改时内存分配次数场景:计数器 incr、decr;分布式锁 setnx expire;json 存储对象hashziplist:元素个数小于512、长度小于64,ziplist即节约内存又保证读写效率hasht

2021-09-02 14:25:15 2339

原创 高频面试Spring之Aop

简介切面编程,提取与业务无关的操作,实现一些方法增强、日志、事务、权限等功能。原理:JDK动态代理或者CGLib代理实现解析aspectj-autoproxy,注册AnnotationAwareAspectJAutoProxyCreater,该类间接实现了beanPostProcessor接口,实例化bean的时候,会调用applyBeanPostProcessorsBeforeInitialization、applyBeanPostProcessorsAfterInitialization两个方法

2021-09-02 14:23:15 2238

原创 高频面试之Ribbon

1、简介实现负载均衡2、负载均衡策略负载均衡的权重策略较为特殊,可重点查看:RandomRule,随机策略,通过 ThreadLocalRandom.current().nextInt(serverCount) 实现,保证随机性和线程隔离性RoundRobinRule,轮询策略,通过 int next = (current + 1) % modulo(所有服务器数) 实现BestAvailableRule,最小并发请求策略,通过 getActiveRequestsCount() 函数选择一个最

2021-09-02 14:21:55 2896

原创 高频面试之Eureka

1、简介注册中心,包含了服务发现、治理等功能。@EnableEurekaServer,作为注册中心;@EnableEurekaClient,作为服务的提供者、或消费者。下面分析下服务发现和治理。2、注册服务当EurekaClient启动后,首先会执行服务注册。EurekaClient将服务信息封装成InstanceInfo对象,通过EurekaHttpClient调用register方法发送POST请求执行服务注册EurekaServer提供了基于Jersey的Rest风格的接口,在Applic

2021-09-02 14:19:51 5293

原创 高频面试Spring之IOC

1、简介IOC的目的:控制反转和依赖注入2、IOC过程简析(针对单例Bean)该问题考察是否读过Spring IOC 源码,以下列举部分流程,应对面试是没问题的:解析配置文件、或注解元数据,将bean的定义转换为BeanDefinition调用getBean()方法获取bean。首先查找缓存,若存在,返回;否则,做创建bean的准备工作,合并BeanDefinition、实例化依赖bean调用doCreateBean方法,创建bean的实例通过createBeanInstance方法并根据

2021-09-02 10:33:35 2375

原创 高频面试SpringBoot之自动装配

1、简述 SpringBoot最常见的问题,会让你列举SpringBoot的优点,以及与Spring的区别。SpringBoot是面试最常问题目之一。SpringBoot是对Spring的扩展和优化,以***自动装配***为核心,简化了配置文件、Maven管理、可快速与三方插件集成,并且jar包可独立运行2、核心注解与常见注解核心注解:@SpringBootApplication 该注解为组合注解,包含了:@SpringBootConfiguration 代替配置文件@EnableAutoCo

2021-09-02 10:23:27 2403

原创 高频面试算法之求众数

1、简介求众数在面试考察算法环节,非常常见,解法较多,而且还有扩展,笔者在京东科技的面试中曾被考察到该题目。题目:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。2、解法一分析该题目,最常见的思路即使用hash表,求得每个元素的个数,再找到其中最大元素个数即可。时间复杂度:O(n);空间复杂度:O(n)。因为空间复杂度较高,所以一般情况下面试官还会继续追问可否优化空间复杂度。2、解法

2021-09-01 19:27:47 2579

原创 JVM 8 源码环境

JVM 8 源码环境1、环境所需软件链接: https://pan.baidu.com/s/12reRfvkhffPHsjkbEk2DmA 密码: nrqm2、编译环境配置步骤1、安装虚拟机以及操作系统,注意:虚拟机磁盘预留空间要大一些,大约30G ~ 50G以上较为合适;CPU 数根据自己电脑配置选择2、解压 jdk-7u80-linux-x64.tar.gz 并配置 Java 环境变量3、解压 apache-ant-1.9.14-bin.zip 并配置 Ant 环境变量,打开 /et

2021-03-13 10:08:58 561

原创 解决国内MacOS无法安装brew问题

解决MacOS无法安装brew问题使用以下命令:jsudo /bin/zsh -c “$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)”

2021-01-02 21:41:23 2836

原创 解决GitHub限速问题

解决GitHub限速下面的操作步骤是在MasOS上执行,Windows操作系统一样,只是最后刷新缓存的命令不同:打开站长工具,找到DNS查询依次输入下面三个域名并找到延迟最小的IPgithub.comassets-cdn.github.comgithub.global.ssl.fastly.netsudo vim /etc/hosts 打开hosts文件将上面得到的ip和域名加入到hosts文件中执行sudo killall -HUP mDNSResponder刷新dns重新通过

2020-11-28 12:57:11 4924

原创 6、FutureTask

6、FutureTask可取消的异步计算。该类提供了一个Future的基本实现,提供了启动和取消计算、查询计算是否完成以及检索计算结果的方法。结果只能在计算完成后才能检索; 如果计算尚未完成,则get方法将阻塞。一旦计算完成,则无法重新启动或取消计算(除非使用runAndReset()调用计算 )。FutureTask可用于包装Callable或Runnable对象。因为FutureTask实现Runnable,一个FutureTask可以提交到一个Executor执行。除了作为独立类之外,此类还提

2020-11-16 09:00:54 3056

原创 5、ScheduledThreadPoolExecutor

5、ScheduledThreadPoolExecutorScheduledThreadPoolExecutor可另外调度在给定延迟之后运行的命令,或定期执行。 ScheduledThreadPoolExecutor的功能与Timer类似,但ScheduledThreadPoolExecutor功能更强大、更灵活。Timer对应的是单个后台线程,而ScheduledThreadPoolExecutor可以在构造函数中指定多个对应的后台线程数。ScheduledThreadPoolExecutor提交、执

2020-11-16 08:59:38 3286

原创 3、Condition 接口

3、Condition 接口前文已经对Lock、ReentrentLock接口进行了简单的分析,但是还有一部分遗漏,就是Condition接口。摘自JDK官方定义:Condition直译过来为“条件”,也可以叫做“条件队列”或“条件变量”,以下统称“条件变量” Condition将Object监视器方法(wait、notify、notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,可以为多个对象实现等待/通知机制。其中,Lock替代了synchronized方法和语句

2020-11-14 10:54:13 3025

原创 4、ThreadPoolExecutor 线程池

1、 ThreadPoolExecutor 线程池降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用线程池,必须对其实现原理了如指掌。2、创建ThreadPoolExecutor、参数、提交任务// 1public ThreadPoolExecutor(

2020-11-11 15:43:58 3053

原创 2、ReadWriteLock

2、 ReadWriteLock 接口ReentrantReadWriteLock是ReentrentLock接口实现之一,具有以下特性:提供了非公平模式(默认)和公平模式。支持重入。支持锁降级。写锁可降级为读锁,但是读锁不可升级为写锁。支持中断。读锁和写锁都支持锁获取期间的中断。支持Condition。ReadWriteLock提供了一对锁,读锁和写锁。其中读锁是共享锁,同一时间可以有多个线程访问;写锁是独占锁(排它锁),同一时间只能有一个线程访问。相对于可重入锁,读写锁通过读写分离、读

2020-08-10 17:25:28 3068

原创 1、Lock接口以及ReentrantLock可重入锁

Java并发编程简析并发编程在Java实际开发中,占有举足轻重的地位,在接下来的篇幅中,以java.util.concurrent包下重要的、常用的接口、实现类为切入点,逐步分析并发编程。下文的一些插图借鉴了《Java并发编程的艺术》!当然笔者水平有限,还请指正错误!1、 Lock 接口自JDK1.5开始,Java提供了Lock接口,实现锁的机制,相对于Synchronize,Lock更为轻量级、同时增加了锁的可操作性。public interface Lock { void lock()

2020-08-10 17:21:22 3213

原创 DroolsWorkbench7.11 源码编译及部署到Tomcat中调试

DroolsWorkbench7.11 源码编译及部署到Tomcat中调试1. 源码下载及编译源码下载创建文件夹drools,打开kiegroup,下载kie-wb-distributions、drools-wb两个工程到drools文件夹,并将两个工程切换到7.11分支。导入IDEA该过程很简单,不多赘述。注意将这两个工程不要单独导入,要放到一起编译kie-wb-distribut...

2019-06-27 16:37:10 4209 3

原创 CentOS 6.5 安装Redis并设置开机自启动

1. 本例资源所有资源都上传到了百度云,点击获取2. liunx 桥接网卡配置1、打开网卡配置vi /etc/sysconfig/network-scripts/ifcfg-eth0 2、编辑网卡配置DEVICE=eth0HWADDR=00:0C:29:D0:09:B7TYPE=EthernetUUID=bdb11c6c-cd3e-4e5e-b23e-1ee0df1432b4...

2019-05-20 22:12:10 3955

Flowchart流程图

Flowchart流程图JS源码,初学Flowchart的可以参考其语法!

2018-09-28

Spring5中文文档

Spring5中文文档,带书签!想学Spring的同学可以看一看!

2018-09-06

空空如也

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

TA关注的人

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