- 博客(436)
- 资源 (32)
- 收藏
- 关注
转载 详述 Spring Boot 中内嵌 Tomcat 的实现原理
对于一个 Spring Boot Web 工程来说,一个主要的依赖标志就是有`spring-boot-starter-web`这个`starter`,`spring-boot-starter-web`模块在 Spring Boot 中其实并没有代码存在,只是在`pom.xml`中携带了一些依赖,包括`web`、`webmvc`和`tomcat`等
2020-05-26 22:41:02 4062
原创 详述 synchronized 和 volatile 的实现原理以及两者的区别
版权声明:本文的内容大都来自于「zejian_」的博文,略作修改。文章目录线程安全synchronized使用方式作用于实例方法作用于静态方法作用于同步代码块实现原理同步代码块同步方法其他可能需要了解的关键点可重入性线程中断等待唤醒机制volatile内存可见性禁止指令重排优化synchronized 和 volatile 的区别线程安全在并发编程中,线程安全是我们最需要关心的问题,而导致并发问题的原因,主要是:存在共享数据;并且,存在多条线程共同操作共享数据。因此,为了解决这个问题,我.
2020-05-24 19:22:31 2716
原创 出现 curl: (51) SSL: no alternative certificate subject name matches target host name 错误的原因及解决方法
## 问题描述![curl-ssh-51](https://img-blog.csdnimg.cn/20200522151604861.png)如上图所示,通过`curl`发起 POST 请求,出现 SSL 51 异常:> curl: (51) SSL: no alternative certificate subject name matches target host name通过异常描述,我们知道,该错误为:没有与目标主机名匹配的证书。
2020-05-23 14:14:31 47145
转载 十分钟搞懂 Lombok 的使用方法与实现原理
Lombok 是一款好用顺手的工具,就像 Google Guava 一样,在此予以强烈推荐,每一个 Java 工程师都应该使用它。Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长代码,尤其是对于简单的 Java 对象(`POJO`),它通过注释实现这一目的。通过在开发环境中使用 Lombok,开发人员可以节省构建诸如`hashCode()`和`equals()`这样的方法以及以往用来分类各种`accessor`和`mutator`的大量时间。
2020-05-23 08:11:44 2806 1
原创 详述 MySQL 中 InnoDB 的索引结构以及使用 B+ 树实现索引的原因
文章目录表空间在 MySQL 的众多存储引擎中,InnoDB 是最常用的存储引擎,也是 MySQL 现阶段唯一免费支持事务机制的存储引擎。在本文中,我们以 InnoDB 为例,介绍 MySQL 的索引结构以及其使用 B+ 树实现索引的原因。表空间首先,来了解一下 MySQL 的表空间。中的所有数据被存储在一个空间内,称之为表空间,表空间内部又可以分为段(segment)、区(extent)、页(page)、行(row),逻辑结构如下图:参考资料:MySQL存储引擎MyISAM和InnoDB底
2020-05-22 08:04:11 4032
原创 二叉树的前序、中序、后序、层序以及蛇形遍历的实现方式
文章目录树节点的定义二叉树的前序遍历递归迭代二叉树的中序遍历递归迭代二叉树的后序遍历递归迭代二叉树的层序遍历递归迭代二叉树的蛇形遍历递归迭代总结树节点的定义首先,给出树节点的定义,方便我们理解下面的算法:public class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode(int x) { val = x; }}
2020-05-16 19:01:53 1336
原创 深入理解 MySQL 事务:隔离级别、ACID 特性及其实现原理
什么是事务?事务(`Transaction`),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元。事务通常由高级数据库操作语言或编程语言(如 SQL,C++ 或 Java)书写的用户程序的执行所引起,并用形如`begin transaction`和`end transaction`语句(或函数调用)来界定。事务由事务开始(`begin transaction`)和事务结束(`end transaction`)之间执行的全部操作组成。
2020-05-10 21:31:48 134167 22
转载 不可不说的 Java “锁”事
文章目录前言1. 乐观锁 VS 悲观锁2. 自旋锁 VS 适应性自旋锁3. 无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁无锁偏向锁轻量级锁重量级锁4. 公平锁 VS 非公平锁5. 可重入锁 VS 非可重入锁6. 独享锁 VS 共享锁结语前言Java 提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自 JDK 8 和 Ne...
2020-05-08 14:36:14 801 1
转载 基于 Redis 的分布式锁实现
文章目录关于分布式锁基于数据库实现分布式锁基于数据库表的增删基于数据库排他锁基于数据库锁的优缺点基于 Zookeeper 实现分布式锁基于缓存实现分布式锁基于 Redis 的分布式锁实现SETNX存在死锁的问题一种实现方式获取锁释放锁总结关于分布式锁很久之前有讲过并发编程中的锁「并发编程的锁机制:synchronized和lock」。在单进程的系统中,当存在多个线程可以同时改变某个变量时,就需...
2020-05-07 19:44:04 695
转载 常用的分布式事务解决方案
众所周知,数据库能实现本地事务,也就是在同一个数据库中,你可以允许一组操作要么全都正确执行,要么全都不执行。这里特别强调了本地事务,也就是目前的数据库只能支持同一个数据库中的事务。但现在的系统往往采用微服务架构,业务系统拥有独立的数据库,因此就出现了跨多个数据库的事务需求,这种事务即为“分布式事务”。那么在目前数据库不支持跨库事务的情况下,我们应该如何实现分布式事务呢?本文首先会为大家梳理分布式事务的基本概念和理论基础,然后介绍几种目前常用的分布式事务解决方案。废话不多说,那就开始吧~
2020-05-07 15:40:16 14404 14
原创 面试官:什么是死锁?如何解决死锁?写一段死锁的代码吧!
## 什么是死锁?死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。产生死锁的原因,主要包括:- 系统资源不足;- 程序执行的顺序有问题;- 资源分配不当等。如果系统资源充足,进程的资源请求都能够得到满足,那么死锁出现的可能性就很低;否则,就会因争夺有限的资源而陷入死锁。其次,程序执行的顺序与速度不同,也可能产生死锁。产生死锁的四个必要
2020-05-06 20:10:31 20078 23
转载 面试官:请你谈谈 Java 的类加载过程
刚刚走出校门的应届毕业生,如果在去寻求一份 Java 开发的工作时,你的面试官很有可能一边看着你的简历,一边漫不经心地问你:了解过 Java 类的加载过程吗?这个时候你一定要注意了,虽然这是一个老生常谈的问题,但是这也是一个非常能够考验你 Java 功底的问题。如果你答好了,这是你应该的;如果你没答好,那么对不起,面试官心中已经给了你不及格。今天,小编就 Java 类加载过程这个问题,抛砖引玉,说一下自己的理解,如果有不对的地方,欢迎大家在评论去指正。
2020-05-05 19:46:09 2788 2
原创 详述 Spring 中 Bean 的生命周期
1 实例化 Bean2 设置对象属性(依赖注入)3 注入 Aware 接口4 BeanPostProcessor5 InitializingBean 与 init-method6 DisposableBean 和 destroy-method
2020-05-05 19:13:20 5182
转载 Java 内存溢出(OOM)异常完全指南
java.lang.OutOfMemoryError:Java heap spaceJava 应用程序在启动时会指定所需要的内存大小,它被分割成两个不同的区域:`Heap space`(堆空间)和`Permgen`(永久代)
2020-05-04 08:31:48 3636
原创 深入理解 JVM 垃圾回收机制及其实现原理
对于 JVM 来说,我们都不陌生,其是 Java Virtual Machine(Java 虚拟机)的缩写,它也是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM 有自己完善的硬件架构,如处理器、堆栈等,还具有相应的指令系统,其本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java 语言的可移植性正是建立在 JVM 的基础上。任何平台只要装有针对于该平台的 Java 虚拟机,字节码文件(`.class`)就可以在该平台上运行。这就是
2020-05-03 13:38:29 401008 167
转载 Spring IOC 容器源码分析:循环依赖的解决方法
Hello everybody,如题,这是一个招聘通知:招聘邮箱:guobinhit@qq.com福利情况:NO1. 带薪假期,国外团建,绩效奖金;NO2. 司龄满足7年发放足金纪念金牌,工龄满7年有无时限自由假;NO3. 每日健身名额,每周两次社团活动,包括羽毛球、篮球、足球和瑜伽。易宝支付是中国支付行业的开创者和领导者,也是互联网金融(ITFIN)和移动互联领军企业。易宝...
2020-04-30 16:53:10 2358 7
转载 分库分表?如何做到永不迁移数据和避免热点?
中大型项目中,一旦遇到数据量比较大,小伙伴应该都知道就应该对数据进行拆分了。有垂直和水平两种。垂直拆分比较简单,也就是本来一个数据库,数据量大之后,从业务角度进行拆分多个库。
2020-04-28 10:21:15 1040
原创 回滚 Git 提交到 GitHub 的 commit 记录
在我们使用 Git 的时候,有时候会遇到想要回滚到某次提交之前的场景。在这时,我们只需要按照如下步骤操作,即可实现这个目的:首先,找到想要回退到某个版本的版本号,查看版本号的命令为`git log`,例如
2020-04-23 20:43:20 6581 3
原创 调度服务 ScheduledExecutorService 经常卡顿问题的排查及解决方法
如上述代码所示,启动 10 个调度线程,延迟 10 秒,开始执行定时逻辑,然后每隔 2 秒执行一次定时任务。定时任务类为`TaskWorker`,其要做的事就是根据`offset`和`rows`参数,到数据库捞取指定范围的待处理记录,然后送到`TaskService`的`processTask`方法中进行处理。从逻辑上来看,该定时没有什么毛病,但是在执行定时任务的时候,却经常出现卡顿的问题,表现出来的现象就是:**定时任务不执行了**。
2020-04-20 17:32:17 82826 2
原创 记一次 JVM CPU 使用率飙高问题的排查过程
首先,我们一起看看通过 VisualVM 监控到的机器 CPU 使用率图:![cpu-usage](https://img-blog.csdnimg.cn/202004071615390.png)如上图所示,在 **下午3:45** 分之前,CPU 的使用率明显飙高,最高飙到近 100%,为什么会出现这样的现象呢?
2020-04-07 23:48:52 62073 39
转载 如何画出一张合格的技术架构图?
当我们想用一张或几张图来描述我们的系统时,是不是经常遇到以下情况:- 对着画布无从下手、删了又来?- 如何用一张图描述我的系统,并且让产品、运营、开发都能看明白?- 画了一半的图还不清楚受众是谁?- 画出来的图到底是产品图功能图还是技术图又或是大杂烩?- 图上的框框有点少是不是要找点儿框框加进来?- 布局怎么画都不满意……如果有同样的困惑,本文将介绍一种画图的方法论,来让架构图更清晰。
2020-03-24 14:39:25 3578 2
原创 详述 JedisCommands 接口中的方法说明
文章目录前言方法说明前言在 JedisCommands 接口中,其提供了操作 Redis 的全部方法,分别对应着 Redis 的各种操作命令,但遗憾的是,该接口中并没有给出详细的注释。在这种情况下,如果我们想知道某个方法的作用,就需要我们找到其对应的 Redis 命令来进行理解了,很不方便。因此,在本文中,给出 JedisCommands 接口中各方法的详细注释,希望对大家有所帮助!顺便,...
2020-03-22 16:15:26 5801
原创 详述 IntelliJ IDEA 遇到 Maven 项目打开(Open)或者导入(Import)失败的解决方法
详述 IntelliJ IDEA 遇到 Maven 项目打开(Open)或者导入(Import)失败的解决方法
2020-03-18 20:10:35 16892
原创 详述 IntelliJ IDEA 遇到快捷键以及删除键不好使的解决方法
详述 IntelliJ IDEA 遇到快捷键以及删除键不好使的解决方法
2020-03-16 21:10:05 4455 4
原创 详述 IntelliJ IDEA 遇到 JavaLaunchHelper 多种实现的解决方法
详述 IntelliJ IDEA 遇到 JavaLaunchHelper 多种实现的解决方法
2020-03-15 15:07:23 1685 8
原创 详述 IntelliJ IDEA 遇到 java -source 1.3 中不支持某某操作的解决方法
详述 IntelliJ IDEA 遇到 java -source 1.3 中不支持某某操作的解决方法
2020-03-14 20:40:45 3046 2
原创 来来来,我们聊一聊,为什么不建议使用递归操作?
Rt. 可能大家都或多或少的听见过类似的话或者建议:尽量少使用递归操作,甚至干脆就不要使用递归操作。但大家在听到这句话的时候,是否会产生过疑问,为什么不建议使用递归操作呢?现在,我们就一起聊聊这个话题,看看递归到底会产生什么样的问题。首先,大家思考一道算法题:如何实现二叉树的中序遍历?对于树的遍历,无论是前序、中序还是后序遍历,大家可能下意识的就会想到使用递归操作,为什么呢?因为递归...
2020-03-14 14:27:04 5735 4
转载 面试官,请不要再问我三次握手和四次挥手了,好吗?
三次握手和四次挥手是各个公司常见的考点,也具有一定的水平区分度,也被一些面试官作为热身题。很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗,最后就歇菜了。见过比较典型的面试场景是这样的:面试官:请介绍下三次握手求职者:第一次握手就是客户端给服务器端发送一个报文,第二次就是服务器收到报文之后,会应答一个报文给客户端,第三次握手就是客户端收到报文后再给服务器发送一个报文,三次握手就...
2020-03-14 09:06:42 1355 1
原创 详述 Java 语言中的 String、StringBuffer 和 StringBuilder 的使用方法及区别
1 简介在 Java 语言中,共有 8 个基本的数据类型,分别为:byte、short、int、long、float、double、boolean 和 char,其中 char 类型用于表示单个字符,例如 a、b、c 、A、B、C、& 这些大小写字母或者特殊字符等等。在实际的编程中,单个的字符并没有我们想象中用的那么频繁,反而是多个字符组成的“字符串”更为常见,但是在基本的数据类型中,并没有字符串这
2020-02-22 22:18:58 2392 6
原创 详述 Elasticsearch 通过范围条件查询索引数据的方法
在使用 Elasticsearch 的时候,我们可能会遇到需要**以范围为条件查询索引数据**的需求。有两种方法可以实现我们的需求:- 第一种:在服务器或者终端,使用命令来查询索引数据;- 第二种:编写程序,通过 Elasticsearch 的 API 来查询索引数据。接下来,我们就以**时间范围**为例,详述这两种查询索引数据的方法。
2019-12-24 18:36:54 93582 82
原创 详述 Elasticsearch 通过 RESTful API 查询索引信息的方法
文章目录情景解决方案情景在使用 Elasticsearch 的时候,我们通常有两种方法来操作集群,第一种:在服务器或者终端,使用命令来操作集群;第二种:编写程序,通过 Elasticsearch 的 API 来操作集群。其中,第一种方式是功能最全的,Elasticsearch 的所有操作情形,都可以通过命令来实现;但与之相对的,第二种方式就显得相形见绌了,因为 Elasticsea...
2019-10-25 17:11:25 3228 3
翻译 Akka 指南 之「断路器」
温馨提示:Akka 中文指南的 GitHub 地址为「akka-guide」,欢迎大家Star、Fork,纠错。文章目录断路器为什么要使用它们?它们做什么?示例初始化基于 Future 和同步的 API显式控制失败计数底层 API断路器为什么要使用它们?在分布式系统中,断路器(circuit breaker)用于提供稳定性和防止级联故障(cascading failures)。这些应该...
2019-10-24 10:07:11 822
原创 性能测试:一种计算 TP90、TP95 和 TP99 等水位线的方法
文章目录前言前言在性能测试中,我们经常会选择 TP90、TP95 或者 TP99 等水位线作为性能指标。在本文中,我们就给出一种计算 TP90、TP95 和 TP95 等水位线的方法。首先,我们先解释一下 TP90、TP95 和 TP95 的含义:TP90,top percent 90,即 90% 的数据都满足某一条件;TP95,top percent 95,即 95% 的数据都满足某一...
2019-09-25 16:34:25 24740 5
原创 详述 IntelliJ IDEA 版本控制不显示颜色提示的解决方法
在使用 IntelliJ IDEA 版本控制功能的时候,有一个功能点特别好,那就是对于新增文件或者修改文件,IDEA 会给出颜色提示,以区分文件类型,如新增、修改或者未加入版本控制。但偶尔会出现导入新check out到本地的项目的时候,不显示颜色提示的问题!如上图所示,这是一个基于 Git 进行版本控制的名为leetcodes的项目。我们新建了一个名为NewNode的类文件,但是未显示任何...
2019-08-14 10:32:14 12178
原创 详述 GitHub 如何将代码从原分支合并到 fork 分支
在使用 GitHub 的过程中,我们可能会遇到这样的问题,即:如何将原分支的代码合并到fork的分支?这个问题其实很常见。当我们fork别人代码的时候,实际上是对原项目当时状态以及进度进行了一个快照,其随后发生的改变,并不会自动同步到我们的fork分支!但是为了保证我们fork的分支状态与原分支同步,这就需要我们主动将原分支的代码合并到我们fork的分支了。现在,以博主fork的akka项...
2019-08-01 16:47:49 8133
原创 解决 axios 提交时间类型参数遇到的时区自动转换问题
文章目录问题描述问题描述在使用axios想后端异步发送时间类型(date)数据的时候,遇到了时间参数自动转换时区的问。如上图所示,通过时间组件选定时间之后,打印出了时间。但是,在数据向后端传输的时候,通过 Chrome 浏览器的Inspect功能,查看Network,发现时间参数被自动修改了。我们选定的时间是2019-07-12 00:00:00,但是在传输的时候被修改为2019-07...
2019-07-13 13:47:01 6955 4
翻译 Akka 指南 之「分布式数据」
当需要在 Akka 集群中的节点之间共享数据时,Akka 分布式数据非常有用。通过提供类似 API 的键值存储的 Actor 访问数据。键是具有数据值类型信息的唯一标识符。这些值是无冲突的复制数据类型(`Conflict Free Replicated Data Types (CRDTs)`)。所有数据条目都通过直接复制和基于`gossip`的协议传播到集群中的所有节点或具有特定角色的节点。你可以对读写的一致性级别进行细粒度控制。自然`CRDTs`可以在不协调的情况下从任何节点执行更新。来自不同节点
2019-06-04 14:03:58 3949 1
原创 Spring Boot 项目启动报 driver class for database type NONE 的原因及解决方法
在默认配置下,Spring Boot 项目会在启动时自动加载数据库相关的配置,如果我们没有在`application.yml`文件中指定数据库配置文件的路径,则会出现该问题。
2019-05-30 20:25:59 6387 1
翻译 Akka 指南 之「跨多个数据中心集群」
本章介绍如何跨多个数据中心、可用性`zones`或区域使用 Akka 集群。了解使用 Akka 集群时数据中心边界的原因是,与同一数据中心中的节点之间的通信相比,跨数据中心的通信通常具有更高的延迟和更高的故障率。然而,节点的分组并不局限于数据中心的物理边界,即使这是主要的使用情况。由于其他原因,它也可以用作逻辑分组,例如隔离某些节点以提高稳定性,或者将大型集群拆分为较小的节点组以获得更好的可伸缩性。
2019-05-30 19:54:03 18448 7
翻译 Akka 指南 之「集群指标扩展」
集群的成员节点可以收集系统健康指标,并在集群指标扩展的帮助下将其发布到其他集群节点和系统事件总线上注册的订阅者。集群指标信息主要用于负载均衡路由器(`load-balancing routers`),也可用于实现基于指标的高级节点生命周期,例如当 CPU 窃取时间过多时“节点让它崩溃”。如果启用了该功能,状态为「[WeaklyUp](https://doc.akka.io/docs/akka/current/cluster-usage.html#weakly-up)」的集群成员将参与集群指标收集和分
2019-05-28 09:36:23 2177 1
2019年北京市导游考试导游词.zip
2019-12-05
阿里巴巴 2016 双 11 背后的技术
2017-01-20
Cornerstone(免费破解版)
2017-01-12
算法设计与分析
2016-11-19
深入理解Java虚拟机:JVM高级特性与最佳实践
2016-11-14
设计模式之禅
2016-11-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人