
工作总结
文章平均质量分 94
Regulus_Li
这个作者很懒,什么都没留下…
展开
-
被你忽视的单元测试-理论篇
测试在软件开发中是至关重要的,在一些架构设计方法论中,测试甚至可以主导系统的架构设计(如TDD),从而进一步的保证了代码的可测试性。可维护和可读的测试代码对于提升单元测试覆盖率至关重要,当我们修改系统中的一些功能或进行重构时,这些单元测试又可以检测我们是否对功能进行了破坏。同时单元测试可以是优秀的代码文档,一个对系统的行为不了解的人可以通过单元测试快速了解各个类的目的和API使用方法原创 2022-10-08 15:47:22 · 502 阅读 · 1 评论 -
ForkJoinPool原理与实战
目录1. 介绍2. 原理解析2.1 work-stealing调度策略2.2 在JUC中的实现1)基本原理2)核心类3)ForkJoinPool4)ForkJoinTask3. 实战3.1 实现方法一:单线程循环累加3.2 实现方法二:ExecutorService多线程并发3.3 实现方法三:使用ForkJoinPool3.4 项目优化1. 介绍Fork/Join框架通过把问题以递归的方式划分为多个子任务,然后并行的执行这些子任务,等所有的子任务都结束的时候,再合并最终结果,通过这种方式来支持并发编程原创 2021-04-23 00:48:21 · 1461 阅读 · 0 评论 -
让线程按指定顺序执行的8种方法
一.前言本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为了知道如何让线程按顺序运行,更是让读者对多线程的使用有更深刻的了解。使用的方法如下:[1] 使用线程的join方法[2] 使用主线程的join方法[3] 使用线程的wait方法[4] 使用线程的线程池方法[5] 使用线程的Condition(条件变量)方法[6] 使用线程的CountDownLatch(倒计数)方法[7] 使用线程的CyclicBarrier(回环栅栏)方法[8] 使用线程原创 2020-06-17 20:42:08 · 3397 阅读 · 1 评论 -
使用SpringBoot自带组件实现定时任务
1.前言定时任务的使用,在开发中可谓是家常便饭了。定时发送邮件、短信;避免数据库、数据表过大,定时将数据转储;通知、对账等等场景。当然实现定时任务的方式也有很多,比如使用 linux下的 crontab 脚本,jdk 中自带的 Timer 类、Spring Task或是 Quartz 。相信你也有过如下的疑问:Spring Task 的 crontab 的表达式 和linux下的 cro...原创 2020-03-28 20:24:17 · 2752 阅读 · 0 评论 -
利用注解指定Spring启动时加载的bean
在开发的过程中,一个接口往往有多个实现类。但根据需求,不一定会使用到所有的实现类。以本人当前遇到的需求为例,一个系统不同的国家部署时,需要使用不同的实现类。在此给出基于注解的实现方法。1.注解定义@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface Adapter { /** ...原创 2020-03-01 17:38:20 · 1579 阅读 · 0 评论 -
异常相关知识点梳理
一. 异常是什么异常是指阻止当前方法或作用域继续执行的问题。比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异常。一个文件找不到的异常:public class TestException { public static void main(String[] args) throws IOException { InputStream is = new...转载 2019-12-15 17:27:51 · 210 阅读 · 0 评论 -
Java并发之AQS
一、概述谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈bstractQueuedSynchronizer(AQS)!类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch…。以下是本文的目录大纲:概述框架源码...转载 2019-09-12 23:49:15 · 157 阅读 · 0 评论 -
@Transactional底层原理
一、事务的基本原理Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行:获取连接 Connection con = DriverManager.getConnection()开启事务con.setAutoCommit(true/false);执行CRUD提交事务/回滚事务 ...转载 2019-09-09 21:08:37 · 3336 阅读 · 1 评论 -
Java实现定时删除动态生成的文件
在工作中遇到一个需求,需要生成一些Zip压缩包供用户下载。为防止旧文件过多撑爆服务器,需要定期删除这些生成的文件。在实现中定义3分钟文件过期,需要被删除。文件地址缓存服务类此类将文件地址缓存起来,key=uuid,value=文件绝对地址。同时定义一个阻塞队列,保存文件生成的时间。定时删除通过Schedule来实现,每10秒钟进行一次扫描。CacheService.java@Compo...原创 2019-09-09 18:15:05 · 863 阅读 · 0 评论 -
SpringBoot开发常用配置总结
错误页面配置与全局异常处理全局错误页面配置方法一:基于框架默认配置使用框架默认的错误页面处理。使用ThymeLeaf模板时springBoot会自动到src/main/resources/templates/error/文件夹下寻找404.htm、500.html的错误提示页面。错误提示页面的命名规则就是:错误码.html,如404是404.html,500是500.html。...原创 2019-09-09 17:56:26 · 202 阅读 · 0 评论 -
Http中Content-Length与Transfer-Encoding区别
1. http/1.1协议中与chunked编码的相关字段1)Entity Body:entity-body只有在message-body出现时才会出现。通过对message-body的解码获得entity-body。transfer-encoding用于确保安全和信息的恰当传输。Entity-length:在应用任何transfer-encoding之前的message-body的长度。...原创 2019-09-08 11:14:33 · 973 阅读 · 0 评论 -
OOM 常见原因及解决方案
当 JVM 内存严重不足时,就会抛出 java.lang.OutOfMemoryError 错误。本文总结了常见的 OOM 原因及其解决方法,如下图所示。如有遗漏或错误,欢迎补充指正。1、Java heap space当堆内存(Heap Space)没有足够空间存放新创建的对象时,就会抛出 java.lang.OutOfMemoryError:Javaheap space 错误(根据实际生产...转载 2019-08-28 20:28:39 · 242 阅读 · 0 评论 -
消息队列高可用性保证
RabbitMQ 的高可用性RabbitMQ 是比较有代表性的,因为是基于主从(非分布式)做高可用性的,我们就以 RabbitMQ 为例子讲解第一种 MQ 的高可用性怎么实现。RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模式。单机模式单机模式,就是 Demo 级别的,一般就是你本地启动了玩玩儿的原创 2019-08-27 20:03:41 · 571 阅读 · 0 评论 -
API网关——zuul
zuul是什么1. API网关在微服务架构中,通常会有多个服务提供者。设想一个电商系统,可能会有商品、订单、支付、用户等多个类型的服务,而每个类型的服务数量也会随着整个系统体量的增大也会随之增长和变更。作为UI端,在展示页面时可能需要从多个微服务中聚合数据,而且服务的划分位置结构可能会有所改变。网关就可以对外暴露聚合API,屏蔽内部微服务的微小变动,保持整个系统的稳定性。简单来说,API网关...原创 2019-08-12 14:33:21 · 232 阅读 · 0 评论 -
Guava学习总结
Cacheguava cache是一个本地缓存。优点线程安全的缓存,与ConcurrentMap相似,但前者增加了更多的元素失效策略,后者只能显示的移除元素。提供了三种基本的缓存回收方式:基于容量回收、定时回收和基于引用回收。定时回收有两种:按照写入时间,最早写入的最先回收;按照访问时间,最早访问的最早回收。监控缓存加载/命中情况。集成了多部操作,调用get方式,可以在未命中缓存的时...原创 2019-08-25 10:08:48 · 609 阅读 · 0 评论 -
全网最全的Java并发面试题及答案
转载自公众号:Java面试那些事儿1、在java中守护线程和本地线程区别?java中的线程分为两种:守护线程(Daemon)和用户线程(User)。任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。Thread.setDaemon()必须在Thread.start()之前调用,否则运行时...转载 2019-08-07 16:17:01 · 212 阅读 · 0 评论 -
ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal解析
说起本地线程变量,我相信大家首先会想到的是JDK默认提供的ThreadLocal,用来存储在整个调用链中都需要访问的数据,并且是线程安全的。本文将详细介绍ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal,并剖析各自的优缺点。1.ThreadLocal详解ThreadLocal对外提供的API如下://从线程上下文环境中获取...原创 2019-08-01 18:37:18 · 609 阅读 · 0 评论 -
Spring-Boot写入、解析CSV,支持上传、下载
工作中遇到了将所有数据整合成CSV文件并下载、上传CSV文件并解析,这两个需求。现在把处理方法记录下来,作为总结。项目构建jar包引入CSV的解析和写入使用到的是commons-csv的包,pom中的定义如下 <dependency> <groupId>org.apache.commons</groupId> ...原创 2019-07-22 18:43:22 · 16605 阅读 · 3 评论 -
Java代码生成器——基于模板快速生成web项目结构
功能介绍根据数据库表的元数据生成支持Rest、RPC协议的工程服务(标准化的代码分层结构工程)。 加速新工程的建设。代码结构:生成代码的结构依赖于模板的定义。本工程中定义分为三个工程${projectName}-domain-api:接口层 - RPC接口API工程${projectName}-domain:领域层 - RPC接口实现(包含domain层 + 基础设施层)${proje...原创 2019-07-29 18:55:05 · 3214 阅读 · 1 评论