自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 Enterprise Architect--数据库表设计

引用文章

2025-03-27 14:42:00 13

原创 CompletableFuture常用用法及踩坑

引用文章

2025-03-27 11:44:10 13

转载 设计模式最佳套路2 —— 愉快地使用管道模式

引用文章https://developer.aliyun.com/article/778865#

2025-03-27 09:38:47 33

转载 设计模式最佳套路1—— 愉快地使用策略模式

策略模式(Strategy Pattern)定义了一组策略,分别在不同类中封装起来,每种策略都可以根据当前场景相互替换,从而使策略的变化可以独立于操作者。比如我们要去某个地方,会根据距离的不同(或者是根据手头经济状况)来选择不同的出行方式(共享单车、坐公交、滴滴打车等等),这些出行方式即不同的策略。

2025-03-26 14:52:06 12

原创 Excel导出工具类--复杂的excel功能导出(使用自定义注解导出)

前言: 简单的excel导出,可以用easy-excel, fast-excel, auto-poi,在导出实体类上加上对应的注解,用封装好的工具类直接导出,但对于复杂的场景, 封装的工具类解决不了,要用原生的excel导出(easy-excel, fast-excel, auto-poi都支持原生的)业务场景:具体实现如下:前端传值:用数组fieldNameList 定义用户勾选的需要导出的字段: fieldNameList = [“productName”,“moduleName”,“quotePro

2025-03-17 15:53:04 238

原创 升级node

2024-12-03 19:59:02 140

原创 idea插件

一、Maven Helper。pom.xml解决包冲突。

2024-11-22 13:44:46 185 1

原创 截图工具Snipaste

先运行Snipaste.exe, 然后按F1进行截图。

2024-11-22 11:06:30 499

原创 idea热部署JRebel & XRebel

修改代码(只测试了Java代码的修改)后,可以按快捷键 Ctrl + Shift + F9,运行后会提示有变化是否需要重新加载,这时选择yes。完成加载以后,就已经实现了热部署的效果。因为JRebel是实时监控class文件的变化来实现热部署的,所以在idea环境下需要打开自动编译才能实现随时的修改,随时生效。在线生成GUID网站: Create GUID online (guidgen.com)安装成功之后就可以通过JRebel启动项目,便可以不用耗费太多的时间在启项目中了。三、激活Jrebel。

2024-11-22 10:51:02 4676 2

原创 idea安装插件

以IDEA为例:打开IDEA,使用快捷键Ctrl+Alt+S或点击“文件”-“设置”-“插件”,点击右上方设置图标,选择“从磁盘安装插件”,选中已下载的zip包进行安装。

2024-11-21 15:38:39 4820

转载 代码自动生成工具AICode

(2)找到Plugins,切换到Marketplace选项卡下,输入“TONGYI ”或“TONGYI Lingma”进行搜索,找到TONGYI Lingma插件,Install安装即可。(3)Install完成后会变成Installed,此时只需要点击OK,无需重启IDEA,等待插件安装完成即可。(1)打开IDEA,File–>Settings…二、Fitten Code。

2024-11-21 11:09:38 258

原创 idea关于git插件操作

选中Merge ‘origin/cpq-v4.0.0’ into ‘cpq-v4.1.1’例如要将cpq-v4.0.0的代码合并到cpq-v4.1.1的代码上。找到要拉取的分支,右键,选择CheckOut,拉取分支代码。然后选中要同步代码的分支,cpq-v4.0.0,右键。首先要将代码切换到cpq-v4.1.1上。一、获取所有的分支列表。四、idea新建分支。

2024-11-19 14:01:43 518

原创 git拉取代码并切换分支

同理, 拉取的也是master主分支的代码, 从项目文件夹中右键Git Bash Here进入git命令行。方案一:命令行拉取, 新件文件夹, 然后右键,选择Git Bash Here, 进入git命令行。然后使用 git checkout -b 命令切换分支。但要拉取其他分支的代码,就要使用切分支命令。这种方式拉取的是master主分支代码。使用 git clone命令拉取代码。绑定后,再用git pull拉取代码。直接用Git Clone拉取代码。会提示要与远程分支进行绑定。

2024-11-19 13:49:13 2792

原创 EasyExcel并行导出多个excel文件并压缩下载

在SpringBoot应用中,采用同步方式导出Excel文件会导致服务器在生成文件期间阻塞,特别是在处理大量数据时,这种效率较低的方法会严重影响性能。为了解决这个问题,可以采用以下改进措施:首先将导出的数据进行拆分,然后利用CompletableFuture将导出任务异步化。相比之下,之前介绍过的《多线程+EasyExcel实现报表优雅导出》使用FutureTask实现的多线程导出方法也能达到类似的效果,但CompletableFuture提供了更简洁的API和更强大的功能,更适合现代并发编程的需求。

2024-11-19 12:33:21 358

转载 前端vue环境搭建

nvm npm_mirror [url] 设置或者查看setting.txt中的 npm_mirror,如果不设置的话默认的是: https://github.com/npm/npm/archive/nvm node_mirror [url] 设置或者查看setting.txt中的node_mirror,如果不设置的默认是 Index of /dist/3)输入 nvm list 查看已安装版本的node nvm ls 也可以。4) nvm use 已安装版本号 切换使用指定的版本的node。

2024-08-28 12:29:00 129

原创 httpClient忽略https的证书认证

接口地址及参数:https://xxx.xxx.com/api/v3/technicians?input_data={“list_info”:{“search_fields”:{“email_id”:“wjjia@iflytek.com”}}}HttpClient工具类范例。

2024-01-24 15:43:46 3423 1

原创 java高并发系列 - 第10天:线程安全和synchronized关键字

当多个线程去访问同一个类(对象或方法)的时候,该类都能表现出正常的行为(与自己预想的结果一致),那我们就可以所这个类是线程安全的。

2023-08-24 16:58:56 242

原创 java高并发系列 - 第11天:线程中断的几种方式

当一个线程处于被阻塞状态或者试图执行一个阻塞操作时,可以使用 Thread.interrupt()方式中断该线程,注意此时将会抛出一个InterruptedException的异常,同时中断状态将会被复位(由中断状态改为非中断状态)内部有循环体,可以通过一个变量来作为一个信号控制线程是否中断,注意变量需要volatile修饰文中的几种方式可以结合起来灵活使用控制线程的中断。

2023-08-23 11:07:31 219

原创 java高并发系列 - 第12天JUC:ReentrantLock重入锁

对比上面的代码,与关键字synchronized相比,ReentrantLock锁有明显的操作过程,开发人员必须手动的指定何时加锁,何时释放锁,正是因为这样手动控制,ReentrantLock对逻辑控制的灵活度要远远胜于关键字synchronized,上面代码需要注意lock.unlock()一定要放在finally中,否则,若程序出现了异常,锁没有释放,那么其他线程就再也没有机会获取这个锁了。输出结果中分析,t2获取到锁了,然后休眠了5秒,t1获取锁失败,t1打印了2条信息,时间相差3秒左右。

2023-08-21 15:45:53 211

原创 java高并发系列 - 第13天:JUC中的Condition对象

在了解Condition之前,需要先了解一下重入锁ReentrantLock,可以移步到。

2023-08-21 10:00:18 171

原创 java高并发系列 - 第14天:JUC中的LockSupport工具类,必备技能

LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程。主要是通过park()和unpark(thread)方法来实现阻塞和唤醒线程的操作的。每个线程都有一个许可(permit),permit只有两个值1和0,默认是0。

2023-08-14 19:42:38 181

原创 java高并发系列 - 第15天:JUC中的Semaphore(信号量)

这个方法会响应线程中断,主线程中对t2、t3发送中断信号之后, acquire()方法会触发 InterruptedException异常,t2、t3最终没有获取到许可,但是他们都执行了finally中的释放许可的操作,最后导致许可数量变为了2,导致许可数量增加了。代码中 newSemaphore(2)创建了许可数量为2的信号量,每个线程获取1个许可,同时允许两个线程获取许可,从输出中也可以看出,同时有两个线程可以获取许可,其他线程需要等待已获取许可的线程释放许可之后才能运行。处等待,导致程序无法结束。

2023-08-10 14:03:06 179

原创 java高并发系列 - 第16天:JUC中等待多线程完成的工具类CountDownLatch,必备技能

CountDownLatch称之为闭锁,它可以使一个或一批线程在闭锁上等待,等到其他线程执行完相应操作后,闭锁打开,这些等待的线程才可以继续执行。确切的说,闭锁在内部维护了一个倒计数器。通过该计数器的值来决定闭锁的状态,从而决定是否允许等待的线程继续执行。常用方法:public CountDownLatch(int count):构造方法,count表示计数器的值,不能小于0,否者会报异常。

2023-08-07 14:41:33 168

原创 java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier的6种使用场景

CyclicBarrier通常称为循环屏障。它和CountDownLatch很相似,都可以使线程先等待然后再执行。不过CountDownLatch是使一批线程等待另一批线程执行完后再执行;而CyclicBarrier只是使等待的线程达到一定数目后再让它们继续执行。

2023-08-03 20:41:16 236

原创 java高并发系列 - 第18天:JAVA线程池

大家用jdbc操作过数据库应该知道,操作数据库需要和数据库建立连接,拿到连接之后才能操作数据库,用完之后销毁。数据库连接的创建和销毁其实是比较耗时的,真正和业务相关的操作耗时是比较短的。每个数据库操作之前都需要创建连接,为了提升系统性能,后来出现了数据库连接池,系统启动的时候,先创建很多连接放在池子里面,使用的时候,直接从连接池中获取一个,使用完毕之后返回到池子里面,继续给其他需要者使用,这其中就省去创建连接的时间,从而提升了系统整体的性能。

2023-08-02 17:02:22 187

原创 java高并发系列 - 第19天:JUC中的Executor框架详解1

Executors框架是Doug Lea的神作,通过这个框架,可以很容易的使用线程池高效地处理并行任务。

2023-08-02 15:17:09 128

原创 java高并发系列 - 第20天:JUC中的Executor框架详解2

ExecutorCompletionService内部有个阻塞队列,任意一个任务完成之后,会将任务的执行结果(Future类型)放入阻塞队列中,然后其他线程可以调用它take、poll方法从这个阻塞队列中获取一个已经完成的任务,获取任务返回结果的顺序和任务执行完成的先后顺序一致,所以最先完成的任务会先返回。从输出中可以看出和我们希望的结果一致,代码中下单顺序是:冰箱、洗衣机,冰箱送货耗时5秒,洗衣机送货耗时2秒,洗衣机先到的,然后被送上楼了,冰箱后到被送上楼,总共耗时12秒,和期望的方案一样。

2023-08-02 10:51:23 146

原创 java高并发系列 - 第21天:java中的CAS

否则,处理器不做任何操作。上面的update语句相当于我们说的CAS操作,执行这个update语句的时候,多线程情况下,数据库会对当前订单记录加锁,保证只有一条执行成功,执行成功的,影响行数为1,执行失败的影响行数为0,根据影响行数来决定提交还是回滚事务。对count++操作的时候,我们让多个线程排队处理,多个线程同时到达request()方法的时候,只能允许一个线程可以进去操作,其他的线程在外面候着,等里面的处理完毕出来之后,外面等着的再进去一个,这样操作count++就是排队进行的,结果一定是正确的。

2023-08-01 20:18:14 247

原创 java高并发系列 - 第22天:JUC底层工具类Unsafe

最近我们一直在学习java高并发,java高并发中主要涉及到类位于java.util.concurrent包中,简称juc,juc中大部分类都是依赖于Unsafe来实现的,主要用到了Unsafe中的CAS、线程挂起、线程恢复等相关功能。所以如果打算深入了解JUC原理的,必须先了解一下Unsafe类。先上一幅Unsafe类的功能图:

2023-08-01 17:11:03 335

原创 java高并发系列 - 第23天:JUC中原子类,一篇就够了

什么是原子操作?atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰,所以,所谓原子类说简单点就是具有原子操作特征的类,原子操作类提供了一些修改数据的方法,这些方法都是原子操作的,在多线程情况下可以确保被修改数据的正确性。

2023-08-01 16:15:56 289

原创 java高并发系列 - 第24天:ThreadLocal、InheritableThreadLocal(通俗易懂)

还是拿上面的问题,我们来分析一下,每个请求都是由一个线程处理的,线程就相当于一个人一样,每个请求相当于一个任务,任务来了,人来处理,处理完毕之后,再处理下一个请求任务。父线程相当于主管,子线程相当于干活的小弟,主管让小弟们干活的时候,将自己兜里面的东西复制一份给小弟们使用,主管兜里面可能有很多牛逼的工具,为了提升小弟们的工作效率,给小弟们都复制一个,丢到小弟们的兜里,然后小弟就可以从自己的兜里拿去这些东西使用了,也可以清空自己兜里面的东西。看一下上面的输出,有些traceId为null,这是为什么呢?

2023-08-01 11:47:12 144

原创 java高并发系列 - 第25天:掌握JUC中的阻塞队列

重点需要了解BlockingQueue中的所有方法,以及他们的区别重点掌握ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、DelayQueue的使用场景需要处理的任务有优先级的,使用PriorityBlockingQueue处理的任务需要延时处理的,使用DelayQueue。

2023-07-31 15:15:56 224

原创 java高并发系列 - 第26篇:学会使用JUC中常见的集合,常看看!

可以看一下这个类的名称:CopyOnWrite,意思是在写入操作的时候,进行一次自我复制,换句话说,当这个List需要修改时,并不修改原有内容(这对于保证当前在读线程的数据一致性非常重要),而是在原有存放数据的数组上产生一个副本,在副本上修改数据,修改完毕之后,用副本替换原来的数组,这样也保证了写操作不会影响读。3种操作,每种操作有2个方法,不同点是队列为空或者满载时,调用方法是抛出异常还是返回特殊值,大家按照表格中的多看几遍,加深记忆。实现了Deque接口,内部使用链表实现的高效的并发双端队列。

2023-07-24 14:18:05 82

原创 java高并发系列 - 第27天:实战篇,接口性能提升几倍原来这么简单

对于无依赖的操作尽量采用并行方式去执行,可以很好的提升接口的性能。

2023-07-24 13:46:11 106

原创 java并发系列 - 第28天:实战篇,微服务日志的伤痛,一并帮你解决掉

关于上面几点,我们需要做的:日志发送的地方进行改造,引入消息中间件,将日志异步发送到消息中间件中,查询的地方采用elasticsearch,日志系统需要订阅消息中间件中的日志,然后丢给elasticsearch建索引,方便快速检索,咱们来一点点的介绍。多个服务之间日志追踪的问题:当一个请求过来的时候,在入口处生成一个trace_id,然后放在ThreadLocal中,如果内部设计到多个服务之间相互调用,调用其他服务的时,将trace_id顺便携带过去。本文主要讨论通过日志来快速定位并解决问题。

2023-07-24 11:32:53 107

原创 java并发系列 - 第29天:高并发中常见的限流方式

从原理上看,令牌桶算法和漏桶算法是相反的,一个“进水”,一个是“漏水”。并发控制的,通俗解释:一大波人去商场购物,必须经过一个门口,门口有个门卫,兜里面有指定数量的门禁卡,来的人先去门卫那边拿取门禁卡,拿到卡的人才可以刷卡进入商场,拿不到的可以继续等待。以秒杀业务为例,10个iphone,100万人抢购,100万人同时发起请求,最终能够抢到的人也就是前面几个人,后面的基本上都没有希望了,那么我们可以通过控制并发数来实现,比如并发数控制在10个,其他超过并发数的请求全部拒绝,提示:秒杀失败,请稍后重试。

2023-07-24 09:58:21 161

原创 java并发系列 - 第30天:JUC中工具类CompletableFuture,必备技能

以下所有的方法都类同。CompletableFuture是java8中新增的一个类,算是对Future的一种增强,用起来很方便,也是会经常用到的一个工具类,熟悉一下。两个CompletionStage,谁执行返回的结果快,我就用那个CompletionStage的结果进行下一步的转化操作。两个CompletionStage,谁执行返回的结果快,我就用那个CompletionStage的结果进行下一步的消耗操作。从示例代码中可以看出,该方法只是消费执行完成的任务,并可以根据上面的任务返回的结果进行处理。

2023-07-21 10:29:54 129

原创 java高并发系列 - 第31天:获取线程执行结果,这6种方法你都知道?

代码中使用FutureTask实现的,FutureTask实现了Runnable接口,并且内部带返回值,所以可以传递给Thread直接运行,futureTask.get()会阻塞当前线程,直到FutureTask构造方法传递的任务执行完毕,get方法才会返回。此行结论有误,请跳过:join的方式,只能阻塞一个线程,如果其他线程中也需要获取thread线程的执行结果,join方法无能为力了。代码中通过join方式阻塞了当前主线程,当thread线程执行完毕之后,join方法才会继续执行。环境:jdk1.8。

2023-07-20 16:09:51 195

原创 SpringBoot 实现扫码登录

2、请求二维码中的http请求。就有uuid在 header中。直接取到uuid 作为webSocket的标识sid进行连接。上面已经提到了前端如何配置webSocket。服务端才可以使用webSocket的方式通知前端。之前项目使用的是 ajax轮询的方式。3、然后手机端使用相机拿到二维码中的uuid。就是放置了二维码中的uuid。这个uuid作为一次会话的标识符使用。就是通知前端 已经登录成功了。就进行业务逻辑操作就可以啦。这样就增加了webSocket的支持啦。这里使用了xmlhttp进行处理。

2023-07-18 15:55:45 162

转载 8 个线程池最佳实践和坑!使用不当直接生产事故!!

从下图可以看出, ThreadPoolExecutor提供了获取线程池当前的线程数和活跃线程数、已经执行完成的任务数、正在排队中的任务数等等。线程数更严谨的计算的方法应该是:最佳线程数 = N(CPU 核心数)∗(1+WT(线程等待时间)/ST(线程计算时间)),其中 WT(线程等待时间)=线程运行总时间 - ST(线程计算时间)。一般建议是不同的业务使用不同的线程池,配置线程池的时候根据当前业务的情况对当前线程池进行配置,因为不同的业务的并发以及对资源的使用情况都不同,重心优化系统性能瓶颈相关的业务。

2023-07-17 17:32:21 182

个人学习资料+后端开发

个人学习资料+后端开发

2024-08-17

cloudalibaba+后端开发+个人学习

cloudalibaba+后端开发+个人学习

2024-08-17

springcloud+后端开发+个人学习2

springcloud+后端开发+个人学习2

2024-08-17

springcloud+后端开发+个人学习1

springcloud+后端开发+个人学习1

2024-08-17

springcloud+后端开发+个人学习

springcloud+后端开发+个人学习

2024-08-17

后端开发+springcloud+个人学习

后端开发+springcloud+个人学习

2024-08-17

后端开发+springboot+个人学习

后端开发+springboot+个人学习

2024-08-17

后端开发+消息中间件+个人学习

后端开发+消息中间件+个人学习

2024-08-17

前端开发+java+个人学习

前端开发+java+个人学习

2024-08-17

空空如也

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

TA关注的人

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