JAVA
文章平均质量分 88
澄风
平淡出奇
展开
-
为什么volatile能保证有序性不能保证原子性?
对于内存模型的三大特性:有序性、原子性、可见性。大家都知道volatile能保证可见性和有序性但是不能保证原子性,但是为什么呢?原创 2024-09-02 17:48:31 · 1141 阅读 · 0 评论 -
【算法一则】【贪心】数组中的数可以拼装成的最大数
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。原创 2024-04-26 08:58:28 · 354 阅读 · 0 评论 -
手撸一个简单的雪花算法生成自增id
雪花算法(Snowflake)是为了解决分布式系统中生成全局唯一ID的需求而设计的。在分布式系统中,如果多个节点同时生成ID,传统的自增ID或随机数ID可能会导致ID冲突,因此需要一种算法来确保在不同节点、不同时间生成的ID都是唯一的。原创 2024-04-09 09:29:51 · 839 阅读 · 0 评论 -
ForkJoin 的使用以及原理
Fork-Join 是一种并行计算模式,它通常用于解决递归式或者分治式的问题。其原理基于将一个大的任务划分成若干个小任务,然后并行地执行这些小任务,最后将它们的结果合并起来得到最终的结果。原创 2024-02-18 14:15:13 · 422 阅读 · 0 评论 -
JAVA的双亲委派机制
双亲委派(Parent Delegation)是一种软件设计模式,常用于Java类加载器的实现。它通过继承关系来实现类的加载,即每个类加载器都有一个父加载器,当一个类加载器需要加载一个类时,它首先将该任务委派给它的父加载器,只有在父加载器无法加载时,才由该加载器自己来完成加载。原创 2024-01-23 17:19:06 · 1020 阅读 · 0 评论 -
牛客刷题第二弹
CMS收集器是一种以获取最短回收停顿时间为目标的收集器,它是基于标记清除算法实现的,它的运作过程相对于其他收集器来说要更复杂一些,整个过程分为四个步骤,包括:初始标记、并发标记、重新标记、并发清除。重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间通常会比初始标记阶段稍长一些,但也远比并发标记阶段的时间短。这种在代码中的体现为:A类方法中的参数包含了B类。HAS-A:聚合关系,拥有关系,是关联关系的一种特例,是整体和部分的关系。原创 2023-08-22 15:59:17 · 145 阅读 · 0 评论 -
牛客刷题第一弹
牛客刷题总结原创 2023-03-10 16:59:35 · 607 阅读 · 0 评论 -
谈谈对分布式锁的理解
为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLock或Synchronized)进行互斥控制。在单机环境中,Java中提供了很多并发处理相关的API。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的Java API并不能提供分布式锁的能力。原创 2023-02-13 08:35:02 · 145 阅读 · 0 评论 -
WeakHashMap 源码浅析
从名字可以得知主要和Map有关,不过还有一个Weak,我们就更能自然而然的想到这里面还牵扯到一种弱引用结构,因此想要彻底搞懂,我们还需要知道四种引用。原创 2023-01-30 09:13:48 · 183 阅读 · 0 评论 -
ThreadLocal/InheritableThreadLocal/TransmittableThreadLocal 应用场景以及核心源码解析
ThreadLocal的应用非常广泛,就ThreadLocal可以实现当前线程的共享数据获取这个就太有用了。正常我们写代码都是由上一个方法传递个下一个方法来进行传递参数,假如说参数繁多,链路非常长,这个时候就会导致形参非常臃肿、传递参数非常不易。这个时候就可以使用ThreadLocal来解决这个问题。原创 2023-01-28 09:04:29 · 803 阅读 · 0 评论 -
总结ES Linux环境配置优化
· 禁用交换区· 增加文件描述符的数量· 确保足够的虚拟内存· 确保有足够的线程数上限· JVM DNS缓存设置· 临时目录不要挂载在noexec下原创 2023-01-17 16:10:47 · 739 阅读 · 0 评论 -
Rocketmq半消息(事务消息)详解
当我们在业务逻辑中发送消息时,消息与业务的事务之间难以保证一致性,如果业务代码出现异常,如果已发送的消息无法回滚,则很会出现数据不一致的情况,RocketMQ的事务消息支持在业务逻辑与发送消息之间提供事务保证,RocketMQ通过两阶段的方式提供事务消息的支持。首需要注意的是 事务消息(半消息) 仅仅只是保证本地事务和MQ消息发送形成整体的 原子性 ,而投递到MQ服务器后,并无法保证消费者一定能消费成功!事务消息。原创 2022-12-29 09:17:17 · 4029 阅读 · 0 评论 -
看完这篇系列文章Spring session你就彻底懂了 - <第一讲> Tomcat session 运作原理以及源码解析
在Spring没有做任何配置的时候,默认会使用Tomcat 自带的session来做session机制。比如没有配置SessionRepository 以及 `@EnableSpringHttpSession`等等。我们下面来分析一个前端请求过来Springboot是如何处理的。我们都知道客户端第一次请求过后服务端会返回一个jsessionid回来,但是这个jsessionid是怎么生成的,第二次及以后访问是如何匹配session的呢?我们下面先从session生成的节点来分析。原创 2022-10-12 16:28:49 · 1001 阅读 · 0 评论 -
Lombok 的实现原理
我们都用过Lombok 可以快速的进行实体类的setter/getter/toString/hash/construct等等方法的自动编编译字节码生成。但我们只加入了一个注解`@Data`或`@Setter`是怎么生成对应方法的字节码的呢?下面听我慢慢分析...原创 2022-09-30 10:33:54 · 2904 阅读 · 4 评论 -
JAVA 基础之OutputStream 详解
在 Java 中所有数据都是使用流读写的。流是一组有序的数据序列,将数据从一个地方带到另一个地方。根据数据流向的不同,可以分为输入(Input)流和输出(Output)流两种。流是一个相对抽象的概念,所谓流就是一个传输数据的通道,这个通道可以传输相应类型的数据。进而完成数据的传输。这个通道被实现为一个具体的对象。原创 2022-09-15 14:36:51 · 28477 阅读 · 1 评论 -
Springboot AOP 如何做可配置切点
Springboot 可以定义注解切点去拦截注解修饰的类方法以及execution (xxxx)切点去拦截具体的类方法。默认情况下我们都会使用注解@PointCut去定义切点,然后定义切面拦截切点。但有些场景需要我们在配置文件(.properties/yml)中配置execution灵活的去修改需要拦截的切点。这样我们可以将一些公共的拦截增强放到jar包推送到仓库中共享。......原创 2022-09-01 10:39:16 · 4057 阅读 · 6 评论 -
AOP 的动态匹配和静态匹配
在创建代理的时候对目标类的每个连接点使用静态切点检查,如果仅通过静态切点检查就可以知道连接点是不匹配的,则在运行时就不再进行动态检查了;如果静态切点检查是匹配的,在运行的时候才进行动态切点检查。Spring采用的机制如下: 在创建代理时对目标类的每个连接点使用静态切点检查,如果仅通过静态切点检查就知可以知道连接点是不匹配的,这在运行时就会进行动态检查。缺点性能较差,动态匹配因为每次调用方法的入参可能都不一样,所以每次调用方法都会判断,因此动态匹配对性能的影响很大,一般情况下,动态匹配不常用。........原创 2022-08-26 09:51:46 · 1106 阅读 · 0 评论 -
前端(Javascript) + JAVA 服务端如何处理 HTTP 断点续传
假如在生产环境客户或操作上传一个很大的文件(可能有1个G),由于现场网络环境很差,上传到0.5个G的时候突然网络断开了,又要重新上传。客户或操作深吸了一口气,重新上传了一次,等了半小时到文件上传90%的时候突然又断开了,这个时候客户或操作不得要奔溃了。哈哈,当然我们做程序的肯定不允许这种事情发生,这个时候肯定要做断点续传。...............原创 2022-08-12 10:19:43 · 1295 阅读 · 0 评论 -
Maven 不同环境引用不同的依赖和配置
在项目开发中可能会产生这样的需求,开发环境依赖于A包,测试环境依赖B包,生产环境依赖于C包。按照我们传统的思维会每个环境注释掉相应的包,然后再打包,一次两次操作还好,操作多了之后这样会很麻烦。............原创 2022-07-28 08:41:33 · 3982 阅读 · 0 评论 -
Springboot 获取http数据、打印HTTP参数的4种方式 (便于生产排查问题)
Java的话本地打断点可以调试获取rest入参(httpheader),但是在生产环境可能我们获取入参(Httpheader/parameter)可能就没有那么的轻松了。我们可能在header中放置了很多自定的参数用来鉴权或者其他用途。如果排查问题的时候需要这些参数,我们有很多种选择去获取这些参数。.................................原创 2022-07-19 13:56:29 · 5823 阅读 · 0 评论 -
JSqlparser 使用攻略(高效的SQL解析工具)
我们可以借助JSqlparser来解析SQL并且动态拼接生成SQL,在Mybatis-plus中的租户其实也是类似这样实现的。甚至有兴趣的同学可以自己做一个SQL拼装器,将前台筛选的条件转换为SQL进行查询。所有的查询字段、条件、联表等等都做成动态拼装。............原创 2022-07-15 15:34:22 · 8713 阅读 · 0 评论 -
ElasticSearch 完全基础总结
文档是索引和搜索数据的最小单位,文档具有 自我包含、层次、灵活的结构三种特性。ElasticSearch中文档是无模式的,也就是说并非所有的文档都需要拥有相同的字段。类型只提供逻辑上的分离。所有文档无论何种类型,都是存储在属于相同分片的同一组文件中。一份分片就是一个Lucene 的索引,类型的名称是Lucene索引中一个字段,所有映射的所有字段都是Lucene索引中的字段。类型是ElasticSearch的一层抽象,单不属于lucene。索引中拥有不同类型的文档。Elasticsearch负责分离这些文档原创 2022-07-13 09:29:05 · 2791 阅读 · 1 评论 -
Springboot ApplicationRunner 详解
在项目中写了一个ApplicationRunner 来启动消费队列线程,结果启动的时候applicationRunner的run方法死活不被调用。通过debug发现,在springboot初始化完环境refresh context之后就会调用started listener然后调用application runner,如果started listner 存在阻塞的话就会导致后续的application runner 不被运行。......原创 2022-07-12 15:04:51 · 11617 阅读 · 0 评论 -
Springboot 如何使用Powermock做单元测试
在做单元测试的时候,我们会发现我们要测试的方法会引用很多外部依赖的对象,比如:(发送邮件,网络通讯,远程服务, 文件系统等等)。 而我们没法控制这些外部依赖的对象,为了解决这个问题,我们就需要用到Mock工具来模拟这些外部依赖的对象,来完成单元测试。PowerMock 也是一个单元测试模拟框架,它是在其它单元测试模拟框架的基础上做出的扩展。通过提供定制的类加载器以及一些字节码篡改技巧的应用,PowerMock 现了对静态方法、构造方法、私有方法以及 Final 方法的模拟支持,对静态初始化过程的移除等强大的原创 2022-07-12 14:34:10 · 4022 阅读 · 0 评论 -
Springboot 单元测试结合Jacoco收集单元测试覆盖率
JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。。。.................................原创 2022-07-07 10:33:35 · 4654 阅读 · 1 评论