- 博客(44)
- 资源 (3)
- 收藏
- 关注

原创 ConcurrentHashMap 1.8 源码剖析(超详细),不懂Java的女朋友们都听懂了
本文主要讨论 1.8 的源码实现,1.7的简单掠过ConcurrentHashMap 1.7底层实现是数组 + 链表 + segment 分段加锁ConcurrentHashMap 在1.7中存在的问题 Hash 冲突严重导致节点上的链表过长,到时候遍历链表的效率太低ConcurrentHashMap 1.8底层实现是数组 + 链表或者红黑树 + CAS + synchroni...
2020-02-15 17:06:54
729

原创 HashMap 1.8 的源码剖析(超详细),女朋友们男朋友们都听懂了
HashMap 底层是基于 数组 + 链表 组成的HashMap里面一些核心的成员变量DEFAULT_INITIAL_CAPACITY = 1 << 4; 数组初始化大小, 16MAXIMUM_CAPACITY = 1 << 30; 数组最大值DEFAULT_LOAD_FACTOR = 0.75f; 默认的负载因子数Entry<K, V> tabl...
2020-01-13 15:34:37
187
原创 【烦人的WebSocket】基于spring boot 版本的 web socket 后端代码实践
WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端
2022-01-13 15:21:16
1643
2
原创 【烦人的加密算法】国密SM3的使用--Java版本
SM3算法:SM3杂凑算法是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。
2022-01-04 12:15:16
7981
1
原创 【烦人的SFTP传输】Java通过SFTP传输文件
开箱即用,直接上代码import com.jcraft.jsch.Channel;import com.jcraft.jsch.ChannelSftp;import com.jcraft.jsch.JSch;import com.jcraft.jsch.Session;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.apache.commons.net.ftp.FTP
2021-09-24 12:08:00
1372
1
原创 【烦人的加密算法】3DES 加密的使用--Java版本
import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import javax.crypto.Cipher;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESedeKeySpec;import javax.crypto.spec.IvParameterSpec;import java.nio.charset.Stan
2021-09-06 09:35:29
341
原创 【烦人的加密算法】AES128 的使用--Java版本
import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import java.nio.charset.StandardCharsets;import java.util.Base64;/** * AES128加密算法 * * @author hcf * @
2021-09-06 09:31:35
530
原创 【烦人的加密算法】国密 SM4 的使用--Java版本
和 SM2 引入的包一样, SM2 为非对称算案发,SM4 为对称算法【烦人的加密算法】国密SM2的使用–Java版本SM4Utils 直接可用import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.bouncycastle.pqc.math.linearal
2021-09-06 09:26:29
3512
原创 【烦人的加密算法】国密SM2的使用--Java版本
开箱即用首先引入包<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.6.8</version></dependency>import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3
2021-09-01 17:41:13
3920
2
原创 【烦人的mybatis】Mybatis自定义拦截器
@Intercepts({ @Signature( method = "query", type = Executor.class, args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class} ), @Signature( typ
2021-05-17 16:35:51
320
原创 【烦人的AOP】使用aop对JDBC做拦截
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <scope>compile</scope></dependency>@Aspectpublic class DaoMonitorAspect { private static final String DB_MONITOR
2021-05-17 16:34:36
671
原创 【烦人的JDK】JDK1.8 新特性常用方法总结
检查list集合中是否存在某个值if (tagList.stream().anyMatch(tag -> tag.getTagId() == 4012)) { continue;}将对象List中的某个字段放到新的List中List<Long> sourceId = itemModels.stream().map(FeedStreamItemModel::getSourceId).collect(Collectors.toList());List 集合的根据.
2021-04-19 18:59:32
217
原创 Java实现监控tomcat线程池
import jodd.util.StringUtil;import org.apache.commons.lang3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.annotation.Scheduled
2021-01-04 10:05:45
1168
原创 Dubbo线程池监控-Java实现
import com.google.common.collect.Maps;import org.apache.dubbo.common.constants.CommonConstants;import org.apache.dubbo.common.extension.ExtensionLoader;import org.apache.dubbo.common.threadpool.manager.DefaultExecutorRepository;import org.apache.dubbo.
2021-01-04 09:45:33
1675
2
原创 【烦人的JMeter】JMeter压测工具安装以及使用
1. 安装1.1. JMeter下载JMeter官网从官网下载JMeter,选择 .zip 的压缩包,这是针对windows的注意一下下载版本对应的JDK版本,否则会导致后面启用JMeter报错下载完解压后的层级结构1.2. JMeter环境变量相关配置1.2.1. 配置环境变量和jdk一样,最先开始配置环境变量(不知道环境变量在哪儿的自行百度)1.2.2. 开始配置环境变量在系统变量框,点击“新建”,建立一个变量:JMETER_HOME和JMeter的安装路径填好保存1.2.
2020-11-20 19:21:39
250
原创 关于excel导入手机号提取时被自动加上多余空万国码“\U202d” “\U202c“的问题
// 去除excel粘贴自动加上的空万国码“\U202d” "\U202c"StringBuilder currentMobile = new StringBuilder();if (mobiles.length() > 12) { for (int i = 0; i < mobiles.length(); i++) { if (mobiles.charAt(i) >= 48 && mobiles.charAt(i) <= 57) { currentM
2020-09-21 12:55:31
1292
原创 【烦人的ThreadLocal】ThreadLocal的工作原理和使用场景
ThreadLocal对ThreadLocal的理解ThreadLocal的工作原理ThreadLocal的应用场景ThreadLocal使用DemoThreadLocal构成图对ThreadLocal的理解通常我们创建变量是可以被任何一个线程访问并修改的,如果想要实现每个线程都有自己的专属本地变量就需要使用到ThreadLocal了。ThreadLocal解决了多线程带来的数据资源竞争问题,解决线程数据的隔离问题,这是因为ThreadLocal就是让每个线程绑定自己的值。如果你创建了一个Thread
2020-08-12 15:08:40
201
原创 大白话讲一讲Spring中对象的循环依赖(非源码级别)
Spring中的循环依赖什么是循环依赖如何解决对象循环依赖解决循环依赖的其他方式很多文章一说起循环依赖,就开始说什么spring 中的三级缓存,又是从源码级别分析,又是从什么三级缓存分析甚至还从spring 容器底层开始分析,很多人看了之后云里雾里,并没有什么好的效果,这种情况下尽管出去面试,你能回答出来多少?本文章从大白话说一说什么循环依赖什么是循环依赖什么是循环依赖这个问题很简单,无非就是 A ref B,B ref A,使得每个对象都无法完成实例化,这是循环依赖最严重的问题如何解决对象循环依
2020-08-05 11:59:30
454
原创 6. 新生代的作用和survivor区的作用
新生代的作用和survivor区的作用区域简图新生代的作用和survivor区的作用为什么会有新生代为什么会有 survivor 区不使用 survivor 区的解决办法新生代使用的回收算法复制算法的思想复制算法的工作流程设置两个Survivor区的作用区域简图在了解新生代的作用和新生代中 survivor 区的作用之前,我们先了解为什么会有新生代以及为什么会有 survivor 区新生代的作用和survivor区的作用为什么会有新生代新生代主要是存放新创建的对象,新对象的生命周期一般也就会随着
2020-07-16 16:40:42
660
原创 5. 虚拟机类加载机制
虚拟机类加载机制双亲委派模型类加载器类加载器的关系双亲委派模型的操作过程类加载机制双亲委派模型类加载器启动类加载器(Bootstrap ClassLoader):虚拟机将能识别的类库加载到虚拟机内存中拓展类加载器(Extension ClassLoader):负责加载指定的路径中的所有类库应用程序类加载器(Application ClassLoader):负责加载用户类路径上所指定的类库类加载器的关系双亲委派模型的操作过程一个类加载器收到了类加载的请求,它不会自己去尝试加载这个类,而是
2020-07-16 15:16:12
112
原创 3. 垃圾收集器(CMS和G1垃圾收集器)
垃圾收集器(CMS和G1垃圾收集器)根据作用代不同分类七种垃圾收集器新生代收集器老年代收集器整堆收集器JVM(HotSpot)7种垃圾收集器1、Serial收集器(串行收集器)2、ParNew收集器3、Parallel Scavenge收集器4、Serial Old收集器5、Paraller Old收集器6、CMS(Conturrent Mark Sweep)收集器CMS收集器运行过程初始登记并发标记重新标记并发清除优点缺点7、G1(Garbage-First)收集器特点垃圾收集过程初始标记并发标记最终标记
2020-07-14 18:39:57
249
原创 4. 内存分配和回收策略
内存分配和回收策略JVM分代垃圾回收策略的基础概念为什么要分代(新生代,老年代,永久代)1. 新生代2. 老年代3. 永久代内存分配和回收策略1. 对象优先在Eden分配2. 大对象直接进入老年代3. 长期存活的对象进入老年代4. 动态对象年龄判定5. 空间分配担保JVM分代垃圾回收策略的基础概念为什么要分代(新生代,老年代,永久代)1. 新生代所有新生成的对象首先都是放在新生代的。新生代的目标就是尽可能快速的收集掉那些生命周期短的对象新生代有划分为Eden、From Survivor和T
2020-07-14 16:41:24
191
原创 2. 对象存活判断和垃圾回收机制
对象存活判断和垃圾回收机制判断对象是否存活引用计数算法算法思路缺点可达性分析算法算法思路可以作为GC Roots 的对象垃圾回收机制算法标记-清除算法缺点复制算法优点缺点标记-整理算法分代收集算法判断对象是否存活引用计数算法算法思路给对象中添加一个计数器, 如果有一个地方引用, 计数器 +1, 引用失效 -1当计数器为0 时说明对象没有地方子引用, 既可以判定这个对象已经消亡缺点不能解决对象间相互循环引用的问题 对象A = 对象B 对象B = 对象A可达性分析算法通过一系列的 GC R
2020-07-14 14:48:47
345
原创 1. Java虚拟机运行时数据区域
Java虚拟机运行时数据区域线程隔离的数据区域程序计数器Java虚拟机栈(虚拟机栈:生命周期和线程相同)本地方法栈线程共享的数据区域Java堆方法区运行时常量池(方法区的一部分)虚拟机中对象的创建过程对象的访问定位线程隔离的数据区域程序计数器程序计数器:是一块较小的内存空间,记录的是当前线程所执行的字节码的行号指示器为什么是线程隔离:首先我们知道,程序计数器是线程隔离的,也就是线程私有的,不受其他线程影响。这是因为,多线程工作是通过频繁的切换并且通过分配处理器执行时间方式来实现的,所以在来回切换的.
2020-07-14 12:05:40
140
原创 0. 如何解决OutOfMemoryError异常
OOM 的产生原因:对象数量到达最大堆的容量限制后就会产生内存溢出异常解决内存溢出异常:首先先通过内存映像分析工具对Dump出来的堆转储快照进行分析确认内存中的对象是否是必要的,如果是必要就是内存溢出(堆内存不够创建对象),不是必要的那就是内存泄漏(对象无法回收)如果是内存泄漏需要通过工具查看泄漏对象到GC Roots 的引用链, 就能找到对应的关联关系进而分析GC不能自动回收的原因如果是内存溢出,可以调节虚拟机的堆参数和服务器的物理内存,从代码层面检查哪些对象声明周期过长虚拟机栈和本地方
2020-07-14 11:18:07
462
原创 JUC并发工具--CyclicBarrier的使用和原理解析
CyclicBarrier和CountDownLatch一样是一种同步辅助工具CyclicBarrier 它允许一组线程在一个共同的屏障点彼此等待,所有线程到达屏障点后再全部同时执行。固定数量的线程在程序中必须彼此等待的时候,CyclicBarrier非常有用同CountDownLatch不同的是:CyclicBarrier的某个线程运行到某个点上之后,该线程即停止运行,直到所有的线程都到达了这个点,所有线程才重新运行;CountDownLatch则不是,某线程运行到某个点上之后,只是给某个数值-1
2020-06-28 17:48:31
255
原创 JUC并发工具--CountDownLatch的使用和原理解析
CountDownLatch 概念CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行CountDownLatch 定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,阻塞队列里面的线程处于挂起状态,当计数器递减到0时会唤醒阻塞队列所有线程,这里的计数器是一个标志,可以表示一个任务一个线程,也可以表示一个倒计时器,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前提业务先执行的场景。CountDownLatch 常用方法说明
2020-06-28 16:15:08
275
原创 线程池详解,带你全面了解线程池
线程池的工作原理如果当前的线程个数比核心池个数小,当任务到来,会优先创建一个新的线程并执行任务当已经到达核心池大小,则把任务放入队列,为了资源不被耗尽,队列的最大容量可能也是有上限的如果达到队列上限则考虑继续创建新线程执行任务,如果此刻线程的个数已经到达最大池上限,则考虑把任务丢弃。ThreadPoolExecutor 的实现public ThreadPoolExecutor(int corePoolSize, int maximu
2020-06-27 19:08:18
197
原创 多线程下CAS的ABA问题有什么危害
什么是CASCAS 是一个原子操作,包含了三个操作数–内存位置,预期原值和新值。如果内存位置的值和预期原值匹配,那么处理器自动将该位置的值更新为新值,否则不做任何操作JUC下面的包都是基于 CAS 的多线程情况下 CAS 存在的问题ABA问题线程A准备用CAS将变量有1 替换成 2,但是在这之前,线程B将变量的值由1 替换成3,又替换成了1,这时候线程A执行CAS会成功,一般场景下ABA并不会出现什么问题,但是当涉及到引用的时候就会出问题。场景是用链表来实现一个栈,初始化向栈中压入B、A两个元素
2020-06-12 18:23:31
1571
原创 保命贴!老司机教你如何应对比女朋友的小心思还要多的设计
好吧,各位看官老爷们,有点标题狗了,这篇主要讲的的是,我们日常经常使用的 API 接口设计当然我们在内网使用的 API 接口可以适当放松一些规范涉及,但是涉及到对外网访问请求的时候,我们就需要考虑比较多的问题了,譬如:API 接口应该如何设计?API 接口应该如何保证安全?API 接口应该如何设置签名?API 接口必要的时候如何进行防重?以上问题是我们在对外提供 API 的时候所必须要考虑的。如何设计也就是说 API 接口需要做哪些,需不需要安全校验,需不需要防重,需不需要高并发等等保证
2020-05-12 11:30:30
415
2
原创 MySQL数据库优化之不能不懂的 Explain 优化
https://blog.youkuaiyun.com/why15732625998/article/details/80388236
2020-04-21 15:30:09
241
原创 Spring事务传播行为详解(示例版)
Spring中七种事务传播行为代码验证文中代码以传统三层结构中两层呈现,即Service和Dao层,由Spring负责依赖注入和注解式事务管理,DAO层由Mybatis实现,你也可以使用任何喜欢的方式,例如,Hibernate,JPA,JDBCTemplate等。数据库使用的是MySQL数据库,你也可以使用任何支持事务的数据库,并不会影响验证结果。首先我们在数据库中创建两张表:-- u...
2020-03-09 22:14:04
192
原创 ThreadPoolExecutor 初始化各参数的含义
序号 参数 含义 备注 1 corePoolSize 核心线程数量,线程池初始化时设定 corePoolSize 大小和 maximumPoolSize 大小一致的话 线程池中的线程将不会空闲、 keepAliveTime 和 timeUnit 就不会再起作用 2 maximumPoolSize 线程池最大线程数(非核心线程) 核心线程 ...
2020-02-10 13:43:15
1376
原创 MySQL主从复制原理,超级详细的总结,看完全通了
主从复制的方式主从复制分为:异步复制,半同步复制和全同步复制异步复制: 是MySQL默认的复制模式,主库在执行完客户端提交的事务之后会立刻将结果返回给客户端,并不关心从库接收的结果,这样就会导致当主数据库因为某些原因宕机之后从数据库可能没有同步到主数据库的数据,导致主从数据不一致,甚者如果将从数据库强制转换为主数据库,可能导致数据丢失优点:返回客户端无延迟缺点:主从数据不一致,数据丢失...
2020-01-12 18:10:40
269
原创 有没有可能2个不相等的对象有相同的hashcode
1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。2、如果两个对象不equals,他们的hashcode有可能相等。3、如果两个对象hashcode相等,他们不一定equals。4、如果两个对象hashcode不相等,他们一定不equals。...
2019-10-31 14:23:19
2091
阿里面试题-JAVA基础.docx
2020-04-21
阿里面试题 JVM-开源框架.docx
2020-04-21
FileZilla 安装包,
2018-01-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人