自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 必知必会--Hashtable扩容机制

前言今天阅读源码时,在Hashtable的扩容机制看到一个有意思的点,整理之后写出来分享给大家。正文Hashtable的扩容机制通过rehash()来实现,如果Hashtable中元素的个数大于临界值时,会调用rehash()来实现扩容。临界值的大小等于Hashtable数组的大小与负载因子相乘,默认的负载因子大小为0.75。protected void rehash() { ...

2019-09-16 14:54:32 10836

原创 springboot启动类--SpringApplication.run()详解

前言实习的第一个项目是利用springboot完成一个需求,在项目搭建的过程中真正感受到springboot的强大,springboot的起步依赖以及自动配置特性简直不要太爽,在项目搭建的过程中解放了我们的小手。而springboot的启动也非常简单,只需要启动springboot的启动类,springboot会帮助我们准备所有的环境,包括server,监听器,装配spring的上下文等等,s...

2019-03-28 11:39:21 55156 2

原创 必知必会--Optional那点事

A container object which may or may not contain a non-null valueOptional作为JDK1.8引入的一个新特性,官方介绍Optional是一个判断对象是否为空的容器。虽然Optional的代码只有350行(还包括大量的注释),但是功能却不简单,算得上小巧而又精悍。在Optional出现之前我们是如何判断为空呢。if(null == object){...}相信这段代码大家再熟悉不过了。假设现在有一个需求,利用下面给出的jso

2021-07-25 19:47:13 402

原创 Java并发--ReentrantReadWriteLock饥饿问题

前言通过阅读ReentrantReadWriteLock的源码我们会发现ReentrantReadWriteLock内部通过AbstractQueuedSynchronizer来实现同步语义,在ReentrantReadWriteLock中拥有读锁与写锁。读锁是一种共享锁,允许多个线程同时获取锁,写锁是一种独占锁,同一时刻只允许一个线程获取。如果在读多写少的情况下,利用ReentrantReadWriteLock很容易造成饥饿问题。饥饿问题:ReentrantReadWriteLock实现了读写分离

2020-08-11 23:22:48 1902 4

原创 Java并发--ArrayBlockingQueue如何实现阻塞队列

前言ArrayBlockingQueue是一个由数组结构组成的有界阻塞队列。同时此队列按照先进先出的原则对元素进行排序。阻塞队列与普通的队列相比较,有两个特殊的操作。一是支持阻塞的插入方法,当队列满时,队列会阻塞插入元素的线程,直到队列不是满时。二是支持阻塞的移除元素,当队列为空时,队列会阻塞移除元素的线程,直到队列非空。那ArrayBlockingQueue如何实现这两个特殊的阻塞操作。正文ArrayBlockingQueue中利用通知模式来实现阻塞语义。所谓通知模式,假设向队列中插入元素的线

2020-07-22 14:30:22 361

原创 Java并发--ReentrantReadWriteLock如何管理读写锁

前言读写锁ReentrantReadWriteLock管理了一组锁,一个读锁,一个写锁。当写锁被获取到时,后续(非当前写操作线程)的读写操作都会被阻塞,写锁释放后,所有的操作继续执行。而当读锁被获取时,后续的任意线程的读锁都可被获取,写锁会被阻塞,当读锁被完全释放后,线程可以获取到写锁。可以看出读锁是共享式锁,写锁是独占式锁。那在ReentrantReadWriteLock中如何管理读写锁?读锁与写锁的获取释放过程是什么?正文ReentrantReadWriteLock中读写锁分别对应着Read

2020-06-23 16:09:35 203

原创 Java并发--重入锁ReentrantLock公平性与非公平性的区别

前言重入锁ReentrantLock有两种方式获取锁,一种是公平性,一种是非公平性。如果在绝对时间上,先请求获取锁的线程一定会先获取到锁,那么这个锁就是公平的,反之,这个锁就是不公平的。公平的获取锁,也就是等待时间最长的线程最优先获取锁,也可以说锁获取是顺序的。那重入锁ReentrantLock如何实现公平锁,以及非公平锁,它们的区别又是什么?正文重入锁ReentrantLock默认使用非公平获取锁,同时提供构造函数,能够控制锁是否是公平。 public ReentrantLock(

2020-06-22 17:38:42 197

原创 Java并发--重入锁ReentrantLock如何实现重入性

前言重入锁ReentrantLock,就是支持线程重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。synchronized关键字隐士的支持锁的可重入性。利用synchronized,执行线程在获取锁之后仍然可以多次获取锁。而ReentrantLock是通过显示去完成锁的可重入性,接下来我们探讨ReentrantLock如何实现可重入性。正文重入性是指任意现场在获取到锁之后再次获取该锁而不会被锁阻塞,重入性的实现主要需要解决两个问题。线程再次获取锁。锁需要去识别获取锁的线程是否为当前占

2020-06-22 16:07:40 941

原创 Java并发--队列同步器AbstractQueuedSynchronizer

前言在Java的多线程环境,如果需要控制多个线程访问共享资源时,我们可以使用synchronized来提供同步,实现锁功能。在Java SE 5之后,Java并发包新增了Lock接口以及相关实现类,我们可以使用Lock实现与synchronized相同的锁功能。由于Lock锁在使用时需要显式地区获取和释放锁,使锁的释放和获取具有可操作性,也衍生了一些功能各异的锁。例如可重入锁ReentrantLock,可重入读写锁ReentrantReadWriteLock。当我们去分析ReentrantLock,Re

2020-06-22 10:51:00 185

原创 手机靓号AABB,ABAA,AABB等规则的正则表达式

正文将11位的手机号进行靓号标识,前7位不做特殊判断,后四位进行靓号判断,同时AAAA不允许满足AABB,AAAB,ABAB等情况。1.尾号AABB:^[0-9]{7}(\d)\1((?!\1)\d)\2$2.尾号AAA:^[0-9]{8}(\d)(\d)\1$3.尾号AAAB:^[0-9]{7}(\d)(\d)\1((?!\1)\d)$4.尾号ABAB:^[0-9]{7}(\d)((?!\1)\d)\1\2$5.尾号AABA:^[0-9]{7}(\d)\1((?

2020-06-15 20:58:59 6079

原创 错误排查:Cannot get a connection, pool error Timeout waiting for idle object

前言项目需要将某一表中的数据同步到搜索中,在进行数据同步时报错提示,Cannot get a connection, pool error Timeout waiting for idle object。报错提示很容易理解,无法获取连接,连接池等待空闲连接超时。排查过程1:查看数据库连接池设置的参数max-active: 20initial-size: 1min-idle: 3max-wait: 600这是我数据库连接池的参数,当你发现连接数设置的国小,可以适当调大相关参数。我在

2020-05-21 21:06:18 5264

原创 Java线程执行native方法时程序计数器为空,如何确保native执行完后的程序执行的位置

絮叨今天在看深入理解Java虚拟机这本书的时候,里面有这句话,如果正在执行的是Native方法,这个计数器值为空(Ubdifined)。看完之后有一点不理解,native方法执行时,程序计数器为空,那执行后,怎么确保接下来执行的位置?这个问题查看了一些资料,在这里参考R大的回答做一个小总结。R大的回答:https://www.zhihu.com/question/40598119/an...

2019-12-18 11:38:16 2198

原创 必知必会--HashMap容量细节

絮叨HashMap作为Java中最常用的数据结构之一,在工作中使用HashMap的频率和你遇见NullPointException一样多,在面试中被问到的概率和问你名字的概率一样大。既然工作,面试经常遇到,我们有必要熟悉HashMap的每一个细节。作为最常用的数据结构之一,我们都知道HashMap的容量为2次幂。当被问到为什么是2次幂时,大家应该都能回答出来,是为了均匀分散到数组中。但是2次幂...

2019-12-13 19:43:11 523 3

原创 SpringBoot整合分库分表利器ShardingSphere

前言ShardingSphere定位为关系型数据库中间件,ShardingSphere包含三个核心的模块Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar。简单介绍一下Sharding-JDBC这个模块:Sharding-JDBC可以理解为可以实现分库分表功能的增强型JDBC,并且可以兼容任何基于Java的ORM框架,比如我们平时用到的mybatis,J...

2019-10-25 11:41:18 858

原创 必知必会--ConcurrentHashMap锁分段原理

前言HashMap是线程不安全的类,JDK1.8之前多线程的情况下,如果多次put操作会导致死循环,尽管JDK1.8对HashMap进行了优化,但是HashMap并不是为了线程安全而设计的类,因此多线程下我们应该尽量避免使用HashMap。Hashtable是线程安全的类,但是当Hashtable进行put操作时会将整个Hashtable对象锁起来,只允许一个线程向Hashtable中pu...

2019-10-12 12:21:31 2973 1

原创 必知必会--HashMap扩容机制

前言JDK1.8对HashMap进行的较大的改动,其中对HashMap的扩容机制进行了优化。在JDK1.8前,在多线程的情况下,使用HashMap进行put操作会造成死循环。这是因为多次put操作会引发HashMap的扩容机制,HashMap的扩容机制采用头插法的方式移动元素,这样会造成链表闭环,形成死循环。JDK1.8中HashMap使用高低位来平移元素,这样保证效率的同时避免了多线程情...

2019-09-11 14:59:42 3794 5

原创 LogBack异步记录日志

前言最近在对项目中的一些接口进行压测,但是压测的结果并不是很理想,接口的响应时间下不来,而吞吐量也迟迟上不去,分析代码发现LogBack记录日志花费了较多的时间,LogBack默认采用同步的方式记录日志,高并发下这也导致一定的线程运行延迟。因此对接口响应时间有特殊要求的接口决定采用异步记录日志的方式。LogBack日志同步记录更改为异步记录并不需要更改原配置,只需要在原配置的基础上再增加一...

2019-08-22 16:58:17 3148

原创 记一次STS.ini参数调优--合理设置JVM参数值

个人的sts.ini方案以及后面的详细说明sts.ini方案:-startupplugins/org.eclipse.equinox.launcher_1.5.400.v20190515-0925.jar--launcher.libraryplugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.1000.v201901...

2019-08-12 10:38:06 1843

原创 SLF4J+LogBack实现不同级别的日志输出到不同文件

前言在项目开发中往往需要将不同的级别,不同包,不同接口的日志输出到不同的文件中,在利用SLF4J+LogBack实现此功能在配置文件中根据不同的级别,包,接口配置不同的appender日志记录器。1.LogBack配置文件<?xml version="1.0" encoding="UTF-8"?><configuration scan="true"> &...

2019-08-01 16:31:01 2015

原创 Windows10子系统Ubuntu18.04LTS更换国内源

1.查看Linux版本$ lsb_release -aDistributor ID: UbuntuDescription: Ubuntu 18.04.2 LTSRelease: 18.04Codename: bionic注意:Codename为bionic当前Ubuntu的版本为Bionic Beaver(仿生海狸)2.备份数据源$...

2019-07-31 11:35:01 13703 5

转载 B树,B+树图文详解

1. B树1.1 B树的定义B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。一颗m阶的B树定义如下:1)每个结点最多有m-1个关键字。2)根结点最少可以只有1个关键字。3)非根结点至少有Math.ceil(m/2)-1个关键字。4)每个结点中的...

2019-07-23 15:28:49 369

原创 LeetCode--旋转图像

问题描述给定一个n×n的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例:给定 matrix = [ [1,2,3], [4,5,6], [7,8,9]],原地旋转输入矩阵,使其变为:[ [7,4,1], [8,5,2], [9...

2019-05-30 10:23:41 117

原创 springboot读取classpath目录下文件

假设静态资源文件 information.txt 放在 src/main/resources 目录下 public String getInfo() { String msg = ""; InputStreamReader intput = null; try { Resource resource = new Clas...

2019-04-16 14:22:50 14224

原创 SpringBoot源码--自动配置分析

前言相信大家都利用过springboot搭建过项目,springboot的强大之处在于起步依赖与自动配置,关于sprinboot的自动配置一直感觉十分的神奇,这几天查看源码研究了一下,基本明白了运行原理,总结一下。1. springboot如何完成自动配置?总结一句话:springboot通过自动配置类完成自动配置。springboot运用自动化配置的方法是:将自动配置类导入spr...

2019-03-21 15:04:41 565

原创 Lombok介绍--简化开发

1.Lombok是什么?lombok官方是这么解释的:Project Lombok是一个java库,可以自动插入编辑器和构建工具,为java增添趣味。永远不要再编写一个getter或equals方法,使用一个注释,您的类就有了一个功能齐全的构建器,自动化了您的日志变量,等等。可以使用lombok的相关注解,让我们不再显示的的为一个类编写setter,getter,toString等方法,因...

2019-03-20 15:57:03 143

原创 项目部署--利用CRT将Java项目部署到服务器

1.Java项目打包利用maven install将项目打包,生成的jar包会保存在项目的target目录中。如果在target中已经存在项目jar包,可利用Maven Clean操作清除target目录。运行成功后刷新查看项目target目录红色矩形中为该java文件的jar包2.CRT连接服务器利用CRT连接到服务器,输入相应的用户名密码。如果在本地启动jar文件...

2019-01-16 14:20:30 607

原创 spring+redis方法内部调用同类方法缓存无效

1.问题描述最近写SpringBoot+redis时,发现当某方法A调用同类方法B,与此同时B方法存在缓存操作,当你调用方法A时你会发现方法B缓存无效。import org.springframework.cache.annotation.CacheConfig;import org.springframework.cache.annotation.Cacheable;@Cache...

2019-01-11 22:19:19 1110

原创 junit测试错误java.lang.Exception: No tests found matching反思与小总结

错误如下:java.lang.Exception:No tests found matching [{ExactMatcher:fDisplayName=testSelectByPrimaryKey], {ExactMatcher:fDisplayName=testSelectByPrimaryKey(com.dao.UserMapperTest)], {LeadingIdentifierMa...

2018-08-05 21:39:38 6510 2

空空如也

空空如也

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

TA关注的人

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