自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(207)
  • 资源 (3)
  • 收藏
  • 关注

原创 Linux面试最高频的5个基本问题

CPU利用率和CPU负载的区别是什么提到CPU利用率,就必须理解时间片。什么是CPU时间片?我们现在所使用的Windows、Linux、Mac OS都是“多任务操作系统”,就是说他们可以“同时”运行多个程序,比如一边打开Chrome浏览器浏览网页还能一边听音乐。但是,实际上一个CPU内核在同一时刻只能干一件事,那操作系统是如何实现“多任务”的呢?大概的方法是让多个进程轮流使用CPU一小段时间,由于这个“一小段时间”很短(在linux上为5ms-800ms之间),用户感觉不到,就好像是几个程序同时在运行了。

2021-02-25 17:33:23 556

原创 从位图到布隆过滤器

从一道面试题引出位图先来看一个经典的。假设当我们需要在1千万个整数(整数的范围在1到1亿之间)里面快速查找某个整数是否存在于其中的话,如何快速查找进行判断会比较方便呢?当然,这个问题最容易想到的就是用散列表来解决。不过,我们可以使用一种比较“特殊”的散列表,那就是位图(BitMap)。我们申请一个大小为1亿、数据类型为布尔类型(true 或者 false)的数组。我们将这1千万个整数作为数组下标,将对应的数组值设置成true。比如,整数5对应下标为5的数组值设置为true,也就是array[5]=tr

2021-02-08 19:04:34 191 1

原创 Spring源码分析——Bean的加载

Spring版本:5.1.14.RELEASEBean实例创建过程如下图,Bean的创建过程大部分是在docreateBean()里面完成的。

2020-12-03 11:29:24 277 1

转载 依赖注入(Dependency Injection)框架是如何实现的

DI容器的核心功能一般有三个:配置解析、对象创建和对象生命周期管理

2020-11-09 13:49:58 2427

原创 彻底理解工厂模式

一般情况下,工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂。不过,在GoF的《设计模式》一书中,它将简单工厂模式看作是工厂方法模式的一种特例,所以工厂模式只被分成了工厂方法和抽象工厂两类。实际上,前面一种分类方法更加常见。在这三种细分的工厂模式中,简单工厂、工厂方法原理比较简单,在实际的项目中也比较常用。而抽象工厂的原理稍微复杂点,在实际的项目中相对也不常用。简单工厂(Simple Factory)简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共

2020-10-22 15:03:39 907 2

原创 为什么组合优先于继承

面向对象编程中,有一条非常经典的设计原则,那就是:组合优于继承,多用组合少用继承。同样地,在《阿里巴巴Java开发手册》中有一条规定:谨慎使用继承的方式进行扩展,优先使用组合的方式实现。为什么不推荐使用继承每个人在刚刚学习面向对象编程时都会觉得:继承可以实现类的复用。所以,很多开发人员在需要复用一些代码的时候会很自然的使用类的继承的方式,因为书上就是这么写的。继承是面向对象的四大特性之一,用来表示类之间的is-a关系,可以解决代码复用的问题。虽然继承有诸多作用,但继承层次过深、过复杂,也会影响到代码的

2020-09-17 18:48:42 11647 8

原创 ThreadLocal及其内存泄露分析

ThreadLocalThreadLocal是一个线程本地变量,作用主要是做数据隔离。ThreadLocal中填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的,每个线程维护自己的变量副本,多个线程互相不可见,因此多线程操作该变量不必加锁,适合不同线程使用不同变量值的场景。数据隔离有什么用,用在哪些场景?一个典型的应用场景就是Spring事务,事务是和线程绑定起来的,Spring框架在事务开始时会给当前线程绑定一个JDBC Connection,整个事务过程都是使用该线程绑定的conne

2020-08-17 20:33:09 521

转载 浅显易懂的策略模式

策略模式就是:定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。我们知道,工厂模式是解耦对象的创建和使用,观察者模式是解耦观察者和被观察者。策略模式跟两者类似,也能起到解耦的作用,不过,它解耦的是策略的定义、创建、使用这三部分。接下来,我就详细讲讲一个完整的策略模式应该包含的这三个部分。

2020-08-13 14:16:38 445

原创 避免缓存穿透的利器之BloomFilter

缓存穿透问题当用户想要查询一个数据,发现缓存中没有,出现缓存未命中,于是转向持久层数据库查询发现也没有,于是本次查询失败,且不会加入缓存。这就会导致,下次再用相同的条件查询时,由于缓存未命中依旧会查数据库,当并发流量很大时,会把DB打垮,这就是缓存穿透。缓存穿透是指查询一个根本不存在的数据,缓存和存储层都没有命中,通常当存储层查不到数据时就不会写入缓存。public Object getItemById(long id) { //从缓存中查 Object item = cache.get(id);

2020-07-26 12:59:41 556

转载 Java堆内存是线程共享的吗

转载声明:Java堆内存是线程共享的!面试官:你确定吗?Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点,所以,即使是一个Java的初学者,也一定或多或少的对JVM有一些了解。可以说,关于JVM的相关知识,基本是每个Java开发者必学的知识点,也是面试的时候必考的知识点。在JVM的内存结构中,比较常见的两个区域就是堆内存和栈内存(如无特指,本文提到的栈均指的是虚拟机栈),关于堆和栈的区别,很多开发者也是如数家珍,有很多书籍,或者网上的文章大概都是这样介绍的:堆是线程共享的内

2020-07-22 15:55:13 1902

原创 二叉树的深度优先遍历与广度优先遍历

public class BinaryTree<T extends Comparable<T>> { /** * 根结点 */ private TreeNode<T> root; /** * 是否通过前序及中序遍历来初始化 */ private boolean initByPreInOrder; public BinaryTree(boolean initByPreInOrder) {

2020-07-16 17:32:30 1305 3

原创 一步一步剖析Mybatis Plugin拦截器原理

责任链模式的定义:多个处理器依次处理同一个业务请求。一个业务请求先经过A拦截器处理,然后再传递给B拦截器,B拦截器处理完后再传递给C拦截器,以此类推,形成一个链条。链条上的每个拦截器各自承担各自的处理职责,所以叫作责任链模式。利用JDK动态代理可以组织多个拦截器,通过这些拦截器我们可以在业务方法执行前后做很多想做的事。具体分析可以从一个普通的需求开始:现在要对多个接口的业务方法做一个日志记录和方法执行耗时的统计。静态代理模式肯定不行,如果这样的接口很多,代理类就会爆炸,要用动态代理。JDK动态代理p

2020-07-09 19:58:36 1164

原创 InnoDB存储引擎为什么选择B+树构建索引

索引是对数据库表中一个或多个列的值进行排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种。索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据;相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。索引在 MySQL 数据库中分三类:B+树索引Hash索引全文索引我们在工作开发中最常接触到的是InnoDB存储引擎中的B+树索引。要了解 B+树索引,就不得不提二叉查找树、平衡二叉树、B树这三种数据结构。B+树就是从他们演化来的。

2020-07-07 20:28:05 2645

原创 Spring中用到的几种典型的设计模式

Spring 框架中用到的设计模式非常多,不下十几种。本文只挑选几种典型的来解析。适配器模式在应用在Spring MVC中Spring MVC定义一个Controller最常用的方式是,通过@Controller注解来标记某个类是Controller类,通过@RequesMapping注解来标记函数对应的URL。不过,定义一个Controller远不止这一种方法。我们还可以通过让类实现Controller接口或者Servlet接口,来定义一个 Controller。这三种定义方式示例代码,如下所示:/

2020-06-10 14:39:13 1504

原创 傻傻分不清楚:模板方法模式与回调函数

优点封装不变部分,扩展可变部分,把认为是不变部分的算法封装到父类实现,而可变部分的则可以通过继承来继续扩展提取公共部分代码,便于维护符合开闭原则,行为由父类控制,而基本方法是由子类实现的,因此子类可以通过扩展的方式增加相应的功能缺点由子类实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响可能引起子类泛滥和为了继承而继承的问题public abstract class AbstractClass { public final void templateMethod()

2020-06-05 16:43:17 1081 2

转载 Java对函数式编程的支持

背景现在主流的编程范式主要有三种,面向过程、面向对象和函数式编程。函数式编程并非一个很新的东西,早在 50 多年前就已经出现了。近几年,函数式编程越来越被人关注,出现了很多新的函数式编程语言,比如Clojure、Scala、Erlang等。一些非函数式编程语言也加入了很多特性、语法、类库来支持函数式编程,比如Java、Python、Ruby、JavaScript等。除此之外,Google Guava也有对函数式编程的增强功能。函数式编程因其编程的特殊性,仅在科学计算、数据处理、统计分析等领域,才能更好

2020-06-01 21:20:47 780

转载 MySQL加锁处理分析

MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题。本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景,了解死锁产生的原因。注:MySQL是一个支持插件式存储引擎的数据库系统。本文下面的所有介绍,都是基于Inno

2020-05-22 15:47:08 1152 2

转载 面向对象及软件设计原则总结

面向对象现在,主流的编程范式或者编程风格有三种,它们分别是面向过程、面向对象和函数式编程。面向对象这种编程风格又是这其中最主流的。现在比较流行的编程语言大部分都是面向对象编程语言。大部分项目也都是基于面向对象编程风格开发的。面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式编码实现的基础。面向对象四大特性理解面向对象编程及面向对象编程语言的关键就是理解其四大特性:封装、抽象、继承、多态。不过,对于这四大特性,光知道它们的定义是不够的,我们还

2020-05-15 16:30:10 1663

原创 Spring的一些知识点总结

什么是spring?Spring是一个轻量级Java开发框架,最早由Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。是一个分层的Java SE/Java EE full-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。Spring可以做很多事情,它为企业级开发提供给了丰富的功能,但是这些

2020-05-14 21:51:51 415

原创 观察者模式及EventBus框架简单实现

观察者模式:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。一般情况下,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer)

2020-05-08 10:11:30 1647

原创 一步一步实现优雅重试

重试的作用对于重试是有场景限制的,不是什么场景都适合重试,比如参数校验不合法、写操作等(要考虑写是否幂等)都不适合重试。远程调用超时、网络突然中断可以重试。在微服务治理框架中,通常都有自己的重试与超时配置,比如dubbo可以设置retries=1、timeout=500调用失败只重试1次,超过500ms调用仍未返回则调用失败。对于开发过网络应用程序的程序员来说,重试并不陌生,由于网络的拥堵和波...

2020-04-29 21:18:48 1227

原创 Java阻塞延迟队列DelayQueue原理及使用

DelayQueue队列中每个元素都有一个过期时间,并且队列是个优先级队列,当从队列获取元素的时候,只有过期元素才会出队。

2020-04-23 21:26:27 12707

原创 Spring容器对默认标签的解析

本文主要研究Spring对配置文件中标签的解析,源码版本:5.2.2.RELEASE。Spring配置文件中的标签中有默认标签和自定义标签两种,标签的解析是在DefaultBeanDefinitionDocumentReader.parseBeanDefinitions函数中进行的,可以看到默认标签与自定义标签有解析是不同的。Spring容器对默认标签的解析先说默认标签的解析过程。默认标签...

2020-04-23 19:57:46 446

原创 读懂消息队列:Kafka与RocketMQ

3月份学完了极客时间的《消息列队高手课》专栏,专栏讲解了许多消息队列的基础知识并且对Kafka与RocketMQ两种主流消息队列有精彩的对比分析。学完专栏后将所有要点整理为笔记记录下来。

2020-04-16 20:25:51 9637 3

原创 从单机文件系统到分布式文件系统

文件及硬盘管理是计算机操作系统的重要组成部分,文件是存储在硬盘上的,文件的读写访问速度必然受到硬盘的物理限制,那么如何才能1分钟完成一个100T大文件的遍历呢?做软件开发时,必然要经常和文件系统打交道,而文件系统也是一个软件,了解文件系统的设计原理,可以帮助我们更好地使用文件系统,另外设计文件系统时的各种考量,也对我们自己做软件设计有诸多借鉴意义。硬盘硬盘是一种可持久保存、多次读写数据的存储...

2020-04-05 12:14:35 2230

原创 再见队列同步器——CountDownLatch实现分析

CountDownLatch使用场景CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有框架服务之后执行。CountDownLatch在多线程并发编程中充当一个计时器的功能。典型的使用例子如下:public class CountDownLatchTest { priv...

2020-04-02 11:15:31 321

转载 为什么需要JMM(Java内存模型)

为什么需要 JMM,它试图解决什么问题?Java 是最早尝试提供内存模型的语言,这是简化多线程编程、保证程序可移植性的一个飞跃。早期类似 C、C++ 等语言,并不存在内存模型的概念(C++ 11 中也引入了标准内存模型),其行为依赖于处理器本身的内存一致性模型,但不同的处理器可能差异很大,所以一段 C++ 程序在处理器 A 上运行正常,并不能保证其在处理器 B 上也是一致的。即使如此,最初的 ......

2020-03-28 10:25:03 2199

原创 又见队列同步器——Condition接口的实现

Condition接口与Object监视器方法任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、nofity()以及notifyAll()方法,这些方法与synchronized同步关键字配合,可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合也可以实...

2020-03-22 21:00:41 723

原创 Java对synchronized锁的实现与优化

当线程释放锁时,JMM(Java Memory Model)会把该线程对应的本地内存中的共享变量刷新到主内存中。当线程获取锁时,JMM会把该线程对应的本地内存置为无效,从而使得被监视器保护的临界区代码必须从主内存中读取共享变量。对象在内存中存储的布局可以分为三块:对象头、实例数据和对齐填充。...

2020-03-21 14:34:11 1182 1

转载 理解Spring中的事务管理

Spring事务的基本原理Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,Spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行:获取连接 Connection con = DriverManager.getConnection()开启事务con.setAutoCommit(true/false);执行CRUD提交事务/回...

2020-03-16 21:42:41 3464

原创 从源码角度理解ReentrantLock及队列同步器(AQS)

JDK中独占锁(排他锁)的实现除了使用关键字synchronized外,还可以使用ReentrantLock。虽然在性能上ReentrantLock和synchronized没有什么区别,但ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。ReentrantLock常常对比着synchronized来分析,我们先对比着来看然后再一点...

2020-03-08 11:54:51 1004

原创 彻底理解Java反射以及动态代理中对反射的应用

反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。简而言之,通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使...

2020-03-01 23:23:43 3338 6

转载 MySQL唯一索引与普通索引怎么选

假设你在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的 SQL 语句:select name from CUser where id_card = 'xxxxxxxyyyyyyzzzzz';所以,你一定会考虑在 id_card 字段上建索引。由于身份证号字段比较大,我不建议你把身份证号当...

2020-02-28 19:05:25 664 1

原创 JVM内存结构与垃圾回收总结

1、JVM内存模型  JVM只不过是运行在你系统上的另一个进程而已,这一切的魔法始于一个java命令。正如任何一个操作系统进程那样,JVM也需要内存来完成它的运行时操作。记住:JVM本身是硬件的一层软件抽象,在这之上才能够运行Java程序,也才有了我们所吹嘘的平台独立性以及“一次编写,处处运行”。 Java虚拟机在执行Java程序的过程中会把它说管理的内存划分为若干个不同的数据区域,如下面两图所示

2020-02-21 17:22:40 7873 4

原创 彻底理解ConcurrentHashMap

1、ConcurrentHashMap概述第1节介绍了HashMap的数据结构及原理,不过遗憾的是,HashMap不是线程安全的。也就是说,在多线程环境下,操作HashMap会导致各种各样的线程安全问题,比如在HashMap扩容重哈希时出现的死循环问题,脏读问题等。HashMap的这一缺点往往会造成诸多不便,虽然在并发场景下HashTable和由同步包装器包装后的HashMap(Collecti...

2020-02-21 17:02:07 801

转载 Java Web程序在Tomcat上是如何运行的

一个 JVM 是一个进程,JVM 上跑 Tomcat,Tomcat 上可以部署多个应用。这样的话,每个跑在 Tomcat 上的应用是一个线程吗?如果一个应用 crash 了,其他应用也会crash吗?理解程序运行时的执行环境,直观感受程序是如何运行的,对我们开发和维护软件很有意义。我们以上面这个问题为例,看下 Java Web 程序的运行时环境是什么样的,来梳理下进程、线程、应用、Web 容器、...

2020-02-18 18:44:09 4906 4

原创 彻底理解HashMap及LinkedHashMap

HashMap是Map族中最为常用的一种,也是 Java Collection Framework 的重要成员。HashMap和双向链表合二为一即是LinkedHashMap。所谓LinkedHashMap,其落脚点在HashMap,因此更准确地说,它是一个将所有Node节点链入一个双向链表的HashMap。ConcurrentHashMap是java.util.concurrent包的重要成员,...

2020-02-18 14:06:55 5048 5

转载 count(*)为什么这么慢

在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。这时候你可能会想,一条 select count(*) from t 语句不就解决了吗?但是,你会发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。然后你可能就想了,MySQL 怎么这么笨啊,记个总数,每次要查的时候直接读出来,不就好了吗。那么今天,我们就来聊聊 count(*) 语句到底是怎样实现的,......

2020-02-16 21:07:18 3362

原创 一条SQL语句是如何执行的

平时我们使用数据库,看到的通常都是一个整体。我们看到的只是输入一条语句,返回一个结果,却不知道这条语句在 MySQL 内部的执行过程。为了弄清楚一条SQL语句是如何执行的,必须要先了解MySQL的结构,然后解析每个模块都发生了什么。MySQL拆解给出的是 MySQL 的基本架构示意图,从中你可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程。大体来说,MySQL 可以...

2020-02-15 16:52:37 1059

原创 ZooKeeper学习笔记及应用场景梳理

官网文档地址:https://zookeeper.apache.org/doc/r3.5.4-beta/zookeeperOver.html概述Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架, 它负责存储和管理大家都关心的数据, 然后接受观察者的注册, 一旦这些数据的状态发生变化, Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做...

2020-01-31 16:46:39 991

《从零开始学架构》精华读书笔记

《从零开始学架构》精华笔记 《从零开始学架构》这本书的内容主要包含以下几部分:1) 架构设计基础,包括架构设计相关概念、历史、原则、基本方法,让架构设计不再神秘;2) 架构设计流程,通过一个虚拟的案例,描述了一个通用的架构设计流程,让架构设计不再依赖天才的创作,而是有章可循;3)架构设计专题:包括高性能架构设计、高可用架构设计、可扩展架构设计,这些模式可以直接参考和应用;4) 架构设计实战,包括重构、开源方案引入、架构发展路径、互联网架构模板等

2023-05-09

信息系统项目管理师学习笔记.zip

信息系统项目管理师学习笔记.zip

2021-05-07

2005-2020信息系统项目管理师历年真题(含上午题、案例分析、论文)试题和答案.zip

15年真题

2021-05-07

阿里巴巴Java开发手册

2017年开春之际,诚意献上重磅大礼:阿里巴巴Java开发手册,首次公开阿里官方Java代码规范标准。这套Java统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率、大大降低代码维护成本。

2017-03-01

空空如也

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

TA关注的人

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