- 博客(62)
- 资源 (3)
- 收藏
- 关注
原创 lombok中使用@Builder构造器模式时的默认值问题
文章参考来源:https://chenyongjun.vip/articles/107。
2023-11-23 17:48:05
999
原创 单测利器——PowerMockito使用心得
PowerMockito是一个帮助我们快速写单测的工具,如果待测试方法中调用了其他方法或远程接口(如RPC、数据库等等),但是我们又不想在单测执行过程中真正的调用,而是mock出一个数据来,那么就可以使用PowerMockito+Mockito来实现了。
2023-04-05 20:38:57
1341
原创 浅析MQ的高可用性
面试题如何保证消息队列的高可用?面试官心理分析如果有人问到你 MQ 的知识,高可用是必问的。虽然MQ有很多优点,比如:解耦、消峰、异步。为我们带来便捷的同事,也提高了系统的复杂度。比如订单流程:用户在订单系统(A)中下订单之后,需要调用库存系统(B)扣除库存,并调用支付系统(C)进行支付,其中一方出问题,这个订单就是有问题的,不适用MQ的情况只需要使用RPC进行远程调用,如果接口返回失败,则任务此订单出错,这种方式的缺点就是响应时间较高,用户请求响应时间取决与A模块的时间加上Max(B,C)的时间
2021-11-20 22:34:36
1076
2
原创 Java工具类java.util.Arrays中asList()方法使用注意事项
最近看到编程规范中说:禁止对Arrays.asList()方法生成的List集合进行add、remove操作,因为会报UnsupportedOperationException。这是为什么呢?原来看源码发现:Arrays.asList()方法最后返回了一个ArrayList对象,那为什么我们不能调用add胡子和remove方法呢?Arrays.asList()源码如下:注意:返回的这个ArrayList对象并不是java.util.ArrayList,而是java.util.Arrays工具类中的
2021-07-24 23:24:14
956
原创 代码托管工具——git使用介绍
最近工作中需要使用git工具对代码进行管理,发现之前学习的东西很多都已经忘记了,这里就进行一下复习,以及对git相关的知识进行一次复盘。git介绍Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。git基本原理git是通过哈希(SHA-1)
2021-07-10 15:06:11
726
原创 操作系统对CPU的虚拟化——进程调度策略
上一篇博客讲述了关于对CPU虚拟化中对进程的抽象、进程相关API以及进程的受限执行,接下来我们接着讲解操作系统中进程的调度策略。想学习上部分内容的小伙伴可以去下边我的上一篇博客学习。操作系统对CPU的虚拟化——进程的抽象、进程相关API以及进程的执行...
2020-10-09 16:49:08
1236
原创 操作系统对CPU的虚拟化——进程的抽象、进程相关API以及进程的受限执行
因为我们计算机的cpu处理器数量是有限的,但是操作系统理论上可以同时并发的运行无数个进程,那么cpu内部是如何实现的呢?另外计算机的cpu处理器数量是有限的,但是操作系统理论上可以同时并发的运行无数个进程,那么cpu内部是如何实现的呢?...
2020-10-09 16:33:28
1300
1
原创 夯实Java基础系列—浮点数在计算机中是如何存储的?
之前面试的时候被问浮点数在计算机中是如何存储的?瞬间懵逼,回来赶紧学习了下弥补自己幼小的心灵。刚刚开始学习Java的时候,我们就学过浮点数包括float和double,其中float占4个字节,double占8个字节。之前并没有细想他们和整形(比如int)有什么区别。学习之后才知道浮点数并不是和整数一样在计算机中直接存储(高位表示符号位、低位是数据位)。废话不多说,言归正传。。浮点型在计算机存储包括三个部分:符号位(1位)+幂指位(8位或者11位)+数值位(23位或者52位)其中位数不同是去呗fl
2020-09-08 17:38:06
298
原创 Redis的过期策略以及内存淘汰机制
Redis中存储的都是key-value数据,因为Redis经常被作为一个缓存使用,因为缓存的大小是有限的,所以可以为每个key设置过期时间。并且Redis的很多其他场景也需要设置过期时间,比如那么Redis实现分布式锁等等。那么底层是如何实现key的过期的呢?看我娓娓道来。。。设置过期时间Redis有四种命令可以用于设置键的生存时间和过期时间:EXPIRE <KEY> <TTL> : 将键的生存时间设为 ttl 秒PEXPIRE <KEY> <TTL&g
2020-08-11 23:22:34
243
原创 小白都能看的懂的ThreadLocal详解
最近有小伙伴,想让我写篇博客,来总结下关于ThreadLocal的内容。ThreadLocal也是一个比较高频的面试知识点了吧,之前关于ThreadLocal的内容一致躺在我的印象笔记里,那么今天我就写篇博客讲解下ThreadLocal的基本原理。概述废话不多说,学习之前先要知道ThreadLocal是干啥的。能帮我们干什么?为什么平时会使用到ThreadLocal。ThreadLocal和synchronized一样,都是用来解决线程安全问题的。只不过ThreadLocal和synchronized
2020-07-24 23:00:59
409
1
原创 一文读懂Java中类的卸载机制
先下结论:使用JVM自带的类加载器(根加载器、扩展类加载器、系统类加载器)加载的类永远不会被卸载,使用自己创建的类加载器才会可能被卸载。至于为什么接下来就来一起研究吧。类的生命周期当一个类被加载、连接和初始化后,它的生命周期就开始了。当代表某个类的Class对象不再被引用,即不可达时,Class对象就会结束生命周期,该类在方法区内的数据也会被卸载,从而结束该类的生命周期。由此可见,一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期。Class对象的引用关系那么Class对象什
2020-07-21 16:03:29
1509
1
原创 Linux中inode简单介绍
大家都知道在Linux中可以使用tail -f 文件名实时追踪文件的更新(不了解如何使用tail实时追踪文件更新的小伙伴可以参考我的另一篇博客,点我点我!)。但是在使用vim+tail -f的时候发现使用vim修改文件之后并不能通过tail -f命令实时追踪到文件的更新(比如日志文件)。通过查看资料发现这个失效的原因正是和我们今天讲的inode息息相关,(具体原因也可以参考我上边提到的博客),所以去研究了下什么是Linux系统中的inode。书归正传。。。操作系统的文件数据除了实际内容之外,通
2020-07-21 15:04:40
2951
1
原创 一文读懂设计模式--适配器模式
概述Adapter pattern 适配器模式:将一个类的接口转换成客户希望的另一个接口,适配器模式让那些接口不兼容的类可以一起工作。上边定义说到的接口只是一个抽象的表示,可以是接口,也可以是类,也可以是对象。所以适配器模式包括三类:对类的适配、对对象的适配和对接口的适配。想要使用适配者设计模式,那么必须包括下边几个基本部分:源类:系统原有的实现,被适配的角色。适配者类:中介类,将原有的实现转换成目标实现目标类:所期望的目标类。因为Java是单继承,所以就要求目标类是一个接口。那么我们什
2020-07-20 16:39:38
183
2
原创 一文读懂设计模式--策略模式
编写代码的时候,需要满足开闭原则,我们想要增加新的功能不能去改变源码,而应该在之前的基础上进行扩展。加入客户有了新的需求,我们应该使用扩展的方式实现。概述策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。使用策略模式可以实现:在不同的环境下可以有不同的执行方法,原理是使用多态来
2020-07-20 11:57:02
208
原创 一文读懂设计模式--装饰者模式
装饰者模式可以给已经存在的对象基础上动态的增强,也就是再不改变之前源码的基础上进行增强。满足开闭原则。装饰者模式实现假设我们想定义一个接口实现人的吃饭功能:之后定义一个被装饰的子类对象:这样就能实现一个人吃麻辣香锅的功能了。测试如下:执行结果:但是如果我们想改变之前的逻辑,一个人在吃饭的时候还要喝啤酒呢?难道我们要去修改Man类的eat()方法吗?难道每次在修改逻辑添加功能的时候都要去修改之前的源码吗?这显然不满足开闭原则。如何更加优雅的在不改变源码的基础上修改之前的功能呢?这就要用到
2020-07-20 11:08:25
298
原创 基于枚举的单例设计模式
创建单例的方式有很多,比如饿汉式、懒汉式、DCL(双重检索机制)以及我们今天讲的枚举方式。其中只有枚举方式的单例不会被破坏,其他方式都能够使用反射或者序列化的方式破坏单例。接下来先看看如何破坏,再讲今天的重头戏枚举方式创建单例对象。如何破坏系统的单例拿最简单的饿汉式单例模式举例,基于饿汉式的单例如下:/** * @author xxy * @date 2020/7/18 */public class Singleton { private static Singleton s
2020-07-18 17:18:01
457
原创 Linux中tail -f实时跟踪文件更新失效的原因
之前在学习Linux的时候,发现有个命令tail,这个命令可以让我们查看文件末尾的数据,比如可以在查看大文件的时候使用。比如操作一个10万行的文档的时候,可以使用:tail hello.txt上面的指令表示查看hello.txt文档的最后10行。也可以使用参数指定查看多少,如:tail -n 20 hello.txt上面的指令表示查看hello.txt文档的最后10行。但是tail命令还有实时查看文件的更新.使用tail -f能够查看文档的更新,比如我们可以查看日志文件的实时更新。比如我
2020-07-13 23:44:23
7389
6
原创 操作系统普遍存在的中断详解
这段时间在学习操作系统的时候发现中断这个东西,就去系统学习了一下。本篇文章是本人辛苦总结之后的成果,如果有什么不准确或者待纠正的地方欢迎广大博友指出。废话不多说,言归正传。中断这个东西虽然我们平时可能没有意识到他的存在,但是他确实普遍存在在操作系统中,并且在操作系统中运行过程中发挥着不可替代的作用。比如线程的挂起和唤醒,进程的调度、I/O完成,代码发生异常(比如Java中的算数异常等等)都和中断有着很大的联系。因为中断是CPU从用户态切换到内核态的唯一方法。那么说了半天,中断到底是什么呢?操作系
2020-07-13 23:22:47
2857
4
原创 什么是CPU的用户态和内核态
之前学习并发的时候只知道挂起线程或者唤醒线程要从用户态转换到内核态,那么什么是用户态?什么是内核态?这也是一个频率较高的面试题。首先在讲用户态和核心态的时候,为了更容易理解先说下什么是操作系统的特权级。特权级的概念:对于任何操作系统来说,创建一个进程是核心功能。创建进程要做很多工作,会消耗很多物理资源。比如分配物理内存,父子进程拷贝信息,拷贝设置页目录页表等等,这些工作得由特定的进程去做,所以就有了特权级别的概念。最关键的工作必须交给特权级最高的进程去执行,这样可以做到集中管理,减少有限资源的访问
2020-07-13 23:12:37
3230
原创 分布式和集群中常见的负载均衡算法
今天我们讨论的是常见的负载均衡算法,小伙伴们如果有机会看到这篇博客,如果有什么建议欢迎评论和留言。刚刚接触分布式或者集群的小伙伴可能会问负载均衡是个什么东东呢?引用百度百科的解释就是负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务
2020-07-10 21:03:59
757
原创 一文读懂synchronized的锁优化
在JDK1.6之后,JVM团队对Java中的synchronized进行了优化,接下来让我们看看他们是如何进行优化的吧。jdk1.6之前的synchronizedJVM是基于进入和退出Monitor对象来实现方法同步和代码块同步。众所周知,synchronized是一个关键字,此关键字可以使作用在方法上或者是同步代码块中。如下:虽然两者都是使用synchronized进行了同步修饰,都能保证同步,也就是同一时刻只有一个线程在执行,但是他们还是有一点区别的。方法上的synchronized
2020-07-07 16:42:12
297
原创 一文读懂一致性哈希
前言伴随着系统流量的增大,出现了应用集群。在 Redis 中为了保证 Redis 的高可用也为 Redis 搭建了集群对数据进行分槽存放。在 Mysql数据库要存储的量达到一个很高的地步的时候,我们会对数据库进行分库分表操作。OK,到这儿先假设我们不知道什么是集群、什么是分库分表,我们先来看一个数据库水平切分演变的例子:假设我们的系统中有一张会员表 customer_info, 我们的系统刚开始无人问津,我们在一个单个的数据库中放这张表,所有的会员记录都插入到这个数据库的这张表中,这没什么问题,是一个
2020-06-29 23:19:26
301
1
原创 线程池的五种状态详解
线程池的5种状态:Running、ShutDown、Stop、Tidying、Terminated。最好的学习方式就是看源码,众所周知,创建线程池肯定会使用到ThreadPoolExecutor类,其中ThreadPoolExecutor的源码的注释不仅讲述了线程池的几种状态,还详细讲解了什么时候或者调用什么方法之后进行状态转换,如下:线程池各个状态切换框架图:1、RUNNING(1) 状态说明:线程池处在RUNNING状态时,能够接收新任务,以及对已添加的任务进行处理。(02) 状态切换:
2020-06-29 14:58:51
8997
原创 同步器的基础之队列同步器AQS
1 AQS 简单介绍AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面。AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。当然,我们自己也能利用AQS非常轻松容易地构造出符合我们自己
2020-06-23 11:43:15
291
原创 为什么lambda表达式使用的局部变量要是final的
为什么 Lambda 表达式(匿名类) 不能访问非 final 的局部变量呢?因为实例变量存在堆中,而局部变量是在栈上分配,Lambda 表达(匿名类) 会在另一个线程中执行。如果在线程中要直接访问一个局部变量,可能线程执行时该局部变量已经被销毁了,而 final 类型的局部变量在 Lambda 表达式(匿名类) 中其实是局部变量的一个拷贝,因为之前的存放在栈中(lambda表达式在其他线程运行的时候可能栈已经释放了),所以必须要拷贝出一份来。Java 8 的 Lambda 可以捕获什么变量呢?(1
2020-06-19 23:01:56
3106
4
转载 JAVA中,字符串相加不一定相等的原因
//JAVA字符串的研究public class JustString {public static void main(String[] args) {String s1 = "ZhouJie";String s2 = "Zhou";String s3 = "Jie";String s4 = "Zhou" + "Jie";String s5 = s2 + s3;String s5s = s5.intern();String s6 = "Zhou" + s3;String s6s = s
2020-06-19 22:30:32
1140
2
原创 Linux中编辑工具vim
vi与vimvi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器。他是我们使用Linux系统不能缺少的工具。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,学会它后,您将在Linux的世界里畅行无阻。vim的特点vim 具有程序编辑的能力,可以以字体颜色辨别语法的正确性,方便程序设计;因为程序简单,编辑速度相当快速。vim可以当作vi的升级版本,他可以用多种颜色的方式来显示一些特殊的信息。vim
2020-06-19 20:55:29
207
原创 Spring中开启事务的方式有哪些
Spring中开启事务的方式主要有两种:编程式事务和声明式事务。编程式事务编程式事务:在代码中调用 commit()、rollback()等事务管理相关的方法。maven pom.xml文件:<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.2.4.RELEASE</
2020-06-17 11:27:31
10148
2
原创 小白都看得懂的快速排序
时隔多日,我又开始了我的博客之旅。。。准备面试的时候真的发现心里一万只xxx在奔腾→_→。今天学习了快排,这应该是比较常见的排序方法了,冒泡排序的时间复杂度为O(n2),相对于冒泡排序而言,快排的平均时间复杂度为O(nlogn)。快排,说白了就是给基准数据找到正确索引位置的过程。不断二分迭代,从而将所有的基准数据都放到正确的位置。快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这
2020-06-10 21:01:17
245
原创 一问读懂同步和异步
”同步“就好比:你去外地上学(人生地不熟),突然生活费不够了;此时你决定打电话回家,通知家里转生活费过来,可是当你拨出电话时,对方一直处于待接听状态(即:打不通,联系不上),为了拿到生活费,你就不停的oncall、等待,最终可能不能及时要到生活费,导致你今天要做的事都没有完成,而白白花掉了时间。“异步”就是:在你打完电话发现没人接听时,猜想:对方可能在忙,暂时无法接听电话,所以你发了一条短信(或者...
2020-05-04 21:38:40
203
转载 java中集合的遍历
我在学习关于LinkedList的知识的时候,看到提示,不能使用普通for循环进行遍历,于是我看了几种list的普通for循环的底层,合作了如下总结。概述Java语言中,提供了一套数据集合框架,其中定义了一些诸如List、Set等抽象数据类型,每个抽象数据类型的各个具体实现,底层又采用了不同的实现方式,比如ArrayList和LinkedList。 除此之外,Java对于数据集合的遍历...
2020-05-02 19:08:24
453
转载 Java 线程的6种状态
关于Java线程的状态网上的说法不一,有的说是6种状态,有的说是5中状态,索性就查看了一下Java源码。Thread类里面有一个枚举类,如下:public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED;}这个枚举类里面有6种类型,所以Java中的...
2020-05-01 00:09:49
234
原创 linux中的防火墙之firewalld
linux中有多种防火墙,centos7.0之前使用的是iptables,在7.0之后使用firewalld。下面我会介绍firewalld防火墙。1、查看防火墙状态systemctl status firewalld2、开启防火墙## systemctl start firewalld3、关闭防火墙systemctl stop firewalld4、重启防火墙system...
2020-04-22 13:02:04
221
原创 浅析mysql中的事务
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。事务的四大特性一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间...
2020-04-14 23:53:26
195
原创 Java虚拟机中类加载的过程
本篇博客主要讲解Java虚拟机加载类的过程。当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,链接,初始化三步来实现这个类进行初始化。其中链接有包括三步:验证、准备和解析。加载简单来说,加载指的是把class字节码文件从各个来源通过类加载器装载入内存中,并且根据字节流创建java.lang.Class对象的过程。这个过程,将类的.class文件中的二进制数据读入内存,放...
2020-04-09 23:21:37
342
原创 JVM的7种垃圾回收器
垃圾回收算法和垃圾回收器对于JVM的垃圾回收算法有复制算法、标记清除、标记整理。这些算法只是天上飞的理念,是一种方法论,但是真正的垃圾回收还需要有落地实现,所以垃圾回收器应运而生。JVM回收的区域包括方法区和堆,jvm对于不同区域不同的特点采用分代收集算法,比如因为所有的对象都是在Eden区进行分配,并且大部分对象的存活时间都不长,都是“朝生夕死”的,每次新生代存活的对象都不多,所以新采取复...
2020-03-29 20:02:29
2814
原创 Java的四种引用:强引用、软引用、弱引用、虚引用
整体引用架构Java中包括四种引用,分别是强引用、软引用、弱引用、虚引用。这些引用关系也对对象的生命周期有着重要的联系。四种引用的架构图如下所示:四种引用的区别和各自特点:Reference就是强引用,SoftReference是弱引用,WeakReference是弱引用,PhantomReference是虚引用。强引用对于普通的Object object = new Objec...
2020-03-28 22:26:47
331
原创 ConcurrentModifcationException详解
本文主要讲解为什么会产生ConcurrentModifcationException,以及底层代码分析,并且避免产生该异常的方法。再讲ConcurrentModifcationException的时候,非常必要的说道集合的迭代器,不同的迭代器会产生不同的效果。Java中的迭代器快速失败(fail—fast)在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、...
2020-03-28 14:02:54
2009
1
转载 一文读懂HashMap
说明:文章转载自:https://www.jianshu.com/p/ee0de4c99f87本文准备从以下几个方面去讲解HashMap:1)HashMap源码详细分析2)HashMap为什么是线程不安全的?3)HashMap和HashTable的区别4)1.7和1.8的HashMap实现区别总结HashMap源码分析构造函数让我们先从构造函数说起,HashMap有四个构造方法,别...
2020-03-27 17:06:04
204
原创 Springboot中对mvc进行扩展
文章目录实现WebMvcConfigurer接口将组件加入到容器中替代默认配置加入容器中一起生效声明:本篇文章所有的内容都是基于***springboot2.2.5***的。关于springboot对mvc的自动配置见我的另一篇博客:https://blog.youkuaiyun.com/qq_42013590/article/details/104879704对于已经有的自动配置显然很多时候并不能满足...
2020-03-19 16:42:48
998
java反编译工具.zip
2020-06-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人