- 博客(23)
- 资源 (2)
- 收藏
- 关注
原创 被你忽视的单元测试-理论篇
测试在软件开发中是至关重要的,在一些架构设计方法论中,测试甚至可以主导系统的架构设计(如TDD),从而进一步的保证了代码的可测试性。可维护和可读的测试代码对于提升单元测试覆盖率至关重要,当我们修改系统中的一些功能或进行重构时,这些单元测试又可以检测我们是否对功能进行了破坏。同时单元测试可以是优秀的代码文档,一个对系统的行为不了解的人可以通过单元测试快速了解各个类的目的和API使用方法
2022-10-08 15:47:22
495
原创 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
1441
原创 《Redis设计与实现》读书笔记
基本数据类型字符串SDS动态字符串定义struct sdshdr{ // 记录buf数组中已使用的字节的数量 // 等于SDS所保存字符串的长度 int len; // 记录buf数组中未使用字节的数量 int free; // 字节数组,用于保存字符串 char buf[];}例如"Redis"字符串:free属性的值为0,表示这个SDS没有分配任何未使用空间。len属性的值为5,表示这个SDS保存了一个五字节长的字符串。buf属性是一个char类型的数组
2021-03-31 18:28:27
208
原创 让线程按指定顺序执行的8种方法
一.前言本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为了知道如何让线程按顺序运行,更是让读者对多线程的使用有更深刻的了解。使用的方法如下:[1] 使用线程的join方法[2] 使用主线程的join方法[3] 使用线程的wait方法[4] 使用线程的线程池方法[5] 使用线程的Condition(条件变量)方法[6] 使用线程的CountDownLatch(倒计数)方法[7] 使用线程的CyclicBarrier(回环栅栏)方法[8] 使用线程
2020-06-17 20:42:08
3368
1
原创 使用SpringBoot自带组件实现定时任务
1.前言定时任务的使用,在开发中可谓是家常便饭了。定时发送邮件、短信;避免数据库、数据表过大,定时将数据转储;通知、对账等等场景。当然实现定时任务的方式也有很多,比如使用 linux下的 crontab 脚本,jdk 中自带的 Timer 类、Spring Task或是 Quartz 。相信你也有过如下的疑问:Spring Task 的 crontab 的表达式 和linux下的 cro...
2020-03-28 20:24:17
2587
原创 利用注解指定Spring启动时加载的bean
在开发的过程中,一个接口往往有多个实现类。但根据需求,不一定会使用到所有的实现类。以本人当前遇到的需求为例,一个系统不同的国家部署时,需要使用不同的实现类。在此给出基于注解的实现方法。1.注解定义@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface Adapter { /** ...
2020-03-01 17:38:20
1574
转载 异常相关知识点梳理
一. 异常是什么异常是指阻止当前方法或作用域继续执行的问题。比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异常。一个文件找不到的异常:public class TestException { public static void main(String[] args) throws IOException { InputStream is = new...
2019-12-15 17:27:51
208
转载 Java并发之AQS
一、概述谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈bstractQueuedSynchronizer(AQS)!类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch…。以下是本文的目录大纲:概述框架源码...
2019-09-12 23:49:15
155
转载 @Transactional底层原理
一、事务的基本原理Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行:获取连接 Connection con = DriverManager.getConnection()开启事务con.setAutoCommit(true/false);执行CRUD提交事务/回滚事务 ...
2019-09-09 21:08:37
3323
1
原创 Java实现定时删除动态生成的文件
在工作中遇到一个需求,需要生成一些Zip压缩包供用户下载。为防止旧文件过多撑爆服务器,需要定期删除这些生成的文件。在实现中定义3分钟文件过期,需要被删除。文件地址缓存服务类此类将文件地址缓存起来,key=uuid,value=文件绝对地址。同时定义一个阻塞队列,保存文件生成的时间。定时删除通过Schedule来实现,每10秒钟进行一次扫描。CacheService.java@Compo...
2019-09-09 18:15:05
859
原创 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
200
原创 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
970
转载 OOM 常见原因及解决方案
当 JVM 内存严重不足时,就会抛出 java.lang.OutOfMemoryError 错误。本文总结了常见的 OOM 原因及其解决方法,如下图所示。如有遗漏或错误,欢迎补充指正。1、Java heap space当堆内存(Heap Space)没有足够空间存放新创建的对象时,就会抛出 java.lang.OutOfMemoryError:Javaheap space 错误(根据实际生产...
2019-08-28 20:28:39
240
原创 消息队列高可用性保证
RabbitMQ 的高可用性RabbitMQ 是比较有代表性的,因为是基于主从(非分布式)做高可用性的,我们就以 RabbitMQ 为例子讲解第一种 MQ 的高可用性怎么实现。RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模式。单机模式单机模式,就是 Demo 级别的,一般就是你本地启动了玩玩儿的
2019-08-27 20:03:41
565
原创 Guava学习总结
Cacheguava cache是一个本地缓存。优点线程安全的缓存,与ConcurrentMap相似,但前者增加了更多的元素失效策略,后者只能显示的移除元素。提供了三种基本的缓存回收方式:基于容量回收、定时回收和基于引用回收。定时回收有两种:按照写入时间,最早写入的最先回收;按照访问时间,最早访问的最早回收。监控缓存加载/命中情况。集成了多部操作,调用get方式,可以在未命中缓存的时...
2019-08-25 10:08:48
603
原创 API网关——zuul
zuul是什么1. API网关在微服务架构中,通常会有多个服务提供者。设想一个电商系统,可能会有商品、订单、支付、用户等多个类型的服务,而每个类型的服务数量也会随着整个系统体量的增大也会随之增长和变更。作为UI端,在展示页面时可能需要从多个微服务中聚合数据,而且服务的划分位置结构可能会有所改变。网关就可以对外暴露聚合API,屏蔽内部微服务的微小变动,保持整个系统的稳定性。简单来说,API网关...
2019-08-12 14:33:21
228
转载 全网最全的Java并发面试题及答案
转载自公众号:Java面试那些事儿1、在java中守护线程和本地线程区别?java中的线程分为两种:守护线程(Daemon)和用户线程(User)。任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。Thread.setDaemon()必须在Thread.start()之前调用,否则运行时...
2019-08-07 16:17:01
204
原创 ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal解析
说起本地线程变量,我相信大家首先会想到的是JDK默认提供的ThreadLocal,用来存储在整个调用链中都需要访问的数据,并且是线程安全的。本文将详细介绍ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal,并剖析各自的优缺点。1.ThreadLocal详解ThreadLocal对外提供的API如下://从线程上下文环境中获取...
2019-08-01 18:37:18
604
原创 Java代码生成器——基于模板快速生成web项目结构
功能介绍根据数据库表的元数据生成支持Rest、RPC协议的工程服务(标准化的代码分层结构工程)。 加速新工程的建设。代码结构:生成代码的结构依赖于模板的定义。本工程中定义分为三个工程${projectName}-domain-api:接口层 - RPC接口API工程${projectName}-domain:领域层 - RPC接口实现(包含domain层 + 基础设施层)${proje...
2019-07-29 18:55:05
3204
1
原创 Spring-Boot写入、解析CSV,支持上传、下载
工作中遇到了将所有数据整合成CSV文件并下载、上传CSV文件并解析,这两个需求。现在把处理方法记录下来,作为总结。项目构建jar包引入CSV的解析和写入使用到的是commons-csv的包,pom中的定义如下 <dependency> <groupId>org.apache.commons</groupId> ...
2019-07-22 18:43:22
16556
3
转载 String使用不当可能导致内存泄露
String是Java中一个比较基础的类,每一个开发人员都会经常接触到。而且,String也是面试中经常会考的知识点。String有很多方法,有些方法比较常用,有些方法不太常用。今天介绍一个String使用不当可能导致内存泄露的问题,主要围绕其subString方法。围绕String和subString也有很多面试题,是比较重要的知识点。substring(int beginIndex, ...
2018-08-15 13:30:15
3107
转载 分布式锁的实现方式
目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。”所以,很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中,都需要牺牲强一致...
2018-08-07 10:30:46
115
转载 B-树,B+树与B*树的优缺点比较
B-树是一种平衡的多路查找(又称排序)树,在文件系统中有所应用。主要用作文件的索引。其中的B就表示平衡(Balance) B+树有一个最大的好处,方便扫库,B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了。 B+树支持range-query(区间查询)非常方便,而B树不支持。这是数据库选用B+树的最主要原因。 比如要查 5-10之间的,B+树一把到5这个标记,再一把到10,...
2018-05-02 16:01:09
1008
实现单处理机下的进程调度程序
2015-12-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人