- 博客(53)
- 资源 (2)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 高频面试Java之线程池
简介本专栏结合笔者面试的一些高频率题目,详细分析其原理、场景、底层机制、以及实际场景等。为了节约篇幅,我们注重分析一些原理、较为底层的东西,对于一些概念性的知识,不多赘述。也希望通过这个专栏,让大家在面试的过程中能够灵活应对。早日收到满意的offer关于线程池的一些概念,如线程池是什么、为什么要使用线程池,不多赘述。1、为什么不推荐使用Executors线程池的创建方式有很多种,这也是面试最常问的问题,归根结底,面试官还是为了考察线程池的参数含义。不推荐使用 Executors的原因是默认参数不友好
2021-09-01 19:04:53
2539
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
292
原创 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
643
原创 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
2409
原创 开发常用设置
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
2389
原创 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
2735
原创 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
4680
原创 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
3013
原创 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
2842
原创 Spring源码之IOC
文章目录2. IOC2.1 IOC 相关概念2.2 测试样例2. IOC2.1 IOC 相关概念作用:控制反转依赖注入bean 作用域prototypesingletonrequestsessionglobal session生命周期,可以理解为在创建、使用、销毁bean的时候,需要调用的方法,依次为BeanNameAwareBeanFactoryAwareApplicationContextAwarePostConstructInitializingBea
2021-09-12 01:18:17
2676
原创 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
2699
原创 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
248
原创 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
1013
原创 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
445
原创 Git配置多个多个账号
1、生成ssh-key针对不同的git地址,生成不同名称的的rsa文件ssh-keygen -t rsa -C "lycdangweijun104@163.com" -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
2750
原创 高频面试MySQL之索引、查询优化
1、简介索引和查询优化是面试比不可少的环节,下面针对B+Tree做一些常见的面试点的分析,从建表、索引、查询三个方面分析。2、数据库和表设计从大的设计原则上,可以考虑分库分表,读写分离,使单表数据不会太大,同时流量分散到不同数据库实例上,减轻数据库压力字段数据类型选择:1)选择占用空间较小的数据类型,使用定长代替变长,如使用unsigned tinyint、smallint代替int;2)对于布尔、枚举类型的字段,使用char(1) 来代替;3)分离text、blob等类型的字段;4)避免单表字段
2021-09-03 10:16:43
2278
原创 高频面试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
2353
原创 高频面试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
2241
原创 高频面试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
2318
原创 高频面试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
2266
原创 高频面试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
2335
原创 高频面试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
2348
原创 高频面试Spring之Aop
简介切面编程,提取与业务无关的操作,实现一些方法增强、日志、事务、权限等功能。原理:JDK动态代理或者CGLib代理实现解析aspectj-autoproxy,注册AnnotationAwareAspectJAutoProxyCreater,该类间接实现了beanPostProcessor接口,实例化bean的时候,会调用applyBeanPostProcessorsBeforeInitialization、applyBeanPostProcessorsAfterInitialization两个方法
2021-09-02 14:23:15
2255
原创 高频面试之Ribbon
1、简介实现负载均衡2、负载均衡策略负载均衡的权重策略较为特殊,可重点查看:RandomRule,随机策略,通过 ThreadLocalRandom.current().nextInt(serverCount) 实现,保证随机性和线程隔离性RoundRobinRule,轮询策略,通过 int next = (current + 1) % modulo(所有服务器数) 实现BestAvailableRule,最小并发请求策略,通过 getActiveRequestsCount() 函数选择一个最
2021-09-02 14:21:55
2916
原创 高频面试之Eureka
1、简介注册中心,包含了服务发现、治理等功能。@EnableEurekaServer,作为注册中心;@EnableEurekaClient,作为服务的提供者、或消费者。下面分析下服务发现和治理。2、注册服务当EurekaClient启动后,首先会执行服务注册。EurekaClient将服务信息封装成InstanceInfo对象,通过EurekaHttpClient调用register方法发送POST请求执行服务注册EurekaServer提供了基于Jersey的Rest风格的接口,在Applic
2021-09-02 14:19:51
5335
原创 高频面试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
2403
原创 高频面试SpringBoot之自动装配
1、简述 SpringBoot最常见的问题,会让你列举SpringBoot的优点,以及与Spring的区别。SpringBoot是面试最常问题目之一。SpringBoot是对Spring的扩展和优化,以***自动装配***为核心,简化了配置文件、Maven管理、可快速与三方插件集成,并且jar包可独立运行2、核心注解与常见注解核心注解:@SpringBootApplication 该注解为组合注解,包含了:@SpringBootConfiguration 代替配置文件@EnableAutoCo
2021-09-02 10:23:27
2422
原创 高频面试算法之求众数
1、简介求众数在面试考察算法环节,非常常见,解法较多,而且还有扩展,笔者在京东科技的面试中曾被考察到该题目。题目:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。2、解法一分析该题目,最常见的思路即使用hash表,求得每个元素的个数,再找到其中最大元素个数即可。时间复杂度:O(n);空间复杂度:O(n)。因为空间复杂度较高,所以一般情况下面试官还会继续追问可否优化空间复杂度。2、解法
2021-09-01 19:27:47
2615
原创 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
620
原创 解决国内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
2857
原创 解决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
5232
原创 6、FutureTask
6、FutureTask可取消的异步计算。该类提供了一个Future的基本实现,提供了启动和取消计算、查询计算是否完成以及检索计算结果的方法。结果只能在计算完成后才能检索; 如果计算尚未完成,则get方法将阻塞。一旦计算完成,则无法重新启动或取消计算(除非使用runAndReset()调用计算 )。FutureTask可用于包装Callable或Runnable对象。因为FutureTask实现Runnable,一个FutureTask可以提交到一个Executor执行。除了作为独立类之外,此类还提
2020-11-16 09:00:54
3141
原创 5、ScheduledThreadPoolExecutor
5、ScheduledThreadPoolExecutorScheduledThreadPoolExecutor可另外调度在给定延迟之后运行的命令,或定期执行。 ScheduledThreadPoolExecutor的功能与Timer类似,但ScheduledThreadPoolExecutor功能更强大、更灵活。Timer对应的是单个后台线程,而ScheduledThreadPoolExecutor可以在构造函数中指定多个对应的后台线程数。ScheduledThreadPoolExecutor提交、执
2020-11-16 08:59:38
3325
原创 3、Condition 接口
3、Condition 接口前文已经对Lock、ReentrentLock接口进行了简单的分析,但是还有一部分遗漏,就是Condition接口。摘自JDK官方定义:Condition直译过来为“条件”,也可以叫做“条件队列”或“条件变量”,以下统称“条件变量” Condition将Object监视器方法(wait、notify、notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,可以为多个对象实现等待/通知机制。其中,Lock替代了synchronized方法和语句
2020-11-14 10:54:13
3089
原创 4、ThreadPoolExecutor 线程池
1、 ThreadPoolExecutor 线程池降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用线程池,必须对其实现原理了如指掌。2、创建ThreadPoolExecutor、参数、提交任务// 1public ThreadPoolExecutor(
2020-11-11 15:43:58
3130
原创 2、ReadWriteLock
2、 ReadWriteLock 接口ReentrantReadWriteLock是ReentrentLock接口实现之一,具有以下特性:提供了非公平模式(默认)和公平模式。支持重入。支持锁降级。写锁可降级为读锁,但是读锁不可升级为写锁。支持中断。读锁和写锁都支持锁获取期间的中断。支持Condition。ReadWriteLock提供了一对锁,读锁和写锁。其中读锁是共享锁,同一时间可以有多个线程访问;写锁是独占锁(排它锁),同一时间只能有一个线程访问。相对于可重入锁,读写锁通过读写分离、读
2020-08-10 17:25:28
3125
原创 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
3265
原创 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
4286
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
3972
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人