自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 前端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 41

原创 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 2574

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

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

2023-08-24 16:58:56 210

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

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

2023-08-23 11:07:31 195

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

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

2023-08-21 15:45:53 187

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

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

2023-08-21 10:00:18 142

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

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

2023-08-14 19:42:38 143

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

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

2023-08-10 14:03:06 148

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

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

2023-08-07 14:41:33 142

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

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

2023-08-03 20:41:16 188

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

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

2023-08-02 17:02:22 161

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

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

2023-08-02 15:17:09 106

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

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

2023-08-02 10:51:23 120

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

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

2023-08-01 20:18:14 221

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

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

2023-08-01 17:11:03 299

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

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

2023-08-01 16:15:56 259

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

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

2023-08-01 11:47:12 123

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

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

2023-07-31 15:15:56 203

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

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

2023-07-24 14:18:05 61

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

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

2023-07-24 13:46:11 88

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

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

2023-07-24 11:32:53 79

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

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

2023-07-24 09:58:21 117

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

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

2023-07-21 10:29:54 104

原创 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 174

原创 SpringBoot 实现扫码登录

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

2023-07-18 15:55:45 120

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

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

2023-07-17 17:32:21 144

原创 java高并发系列 - 第32天:高并发中计数器的实现方式有哪些?

LongAdder在并发量比较大的情况下,操作数据的时候,相当于把这个数字分成了很多份数字,然后交给多个人去管控,每个管控者负责保证部分数字在多线程情况下操作的正确性。先介绍一下LongAdder,说到LongAdder,不得不提的就是AtomicLong,AtomicLong是JDK1.5开始出现的,里面主要使用了一个long类型的value作为成员变量,然后使用循环的CAS操作去操作value的值,并发量比较大的情况下,CAS操作失败的概率较高,内部失败了会重试,导致耗时可能会增加。

2023-07-17 14:45:08 388

原创 java高并发系列 - 第34篇:google提供的一些好用的并发工具类

ListeningExecutorService接口继承于juc中的ExecutorService接口,对ExecutorService做了一些扩展,看其名字中带有Listening,说明这个接口自带监听的功能,可以监听异步执行任务的结果。上面通过调用Futures的静态方法addCallback在异步执行的任务中添加回调,回调的对象是一个FutureCallback,此对象有2个方法,任务执行成功调用onSuccess,执行失败调用onFailure。本文演示几个简单的案例,见一下guava的效果。

2023-07-14 14:08:14 176

原创 java高并发系列 - 第33篇:怎么演示公平锁和非公平锁?

公平锁和非公平锁体现在别人释放锁的一瞬间,如果前面已经有排队的,新来的是否可以插队,如果可以插队表示是非公平的,如果不可用插队,只能排在最后面,是公平的方式。示例。

2023-07-13 15:36:44 115

原创 线程池的一个BUG导致CPU达到100%

就是 1731 年,雍正九年,那个时候的皇帝还是九子夺嫡中一顿乱杀,冲出重围的胤禛大佬。在研究前面提到的编号为 8065320 的 BUG 的时候,我还发现一个意外收获,编号为 8051859 的 BUG,它们是挨着的,排排坐。他说,在这个示例下,如果你在一个只有单核的服务器上跑,然后使用 TOP 命令,会看到持续 60 秒的 CPU 使用率为 100%。因为 keepAlive 参数设置的为 0,那么就会导致线程在 getTask 方法里面非常频繁的循环,从而导致 CPU 飙高。

2023-07-13 14:35:03 938

原创 小心 MybatisPlus 的一个坑

这本是好意,但是在我这个场景有点麻,它完美的复现了上文提到的那个错误使用,在有重复 key 的场景确实报错了,但是被外层 try-catch 拦住了抛错,不过事务上已经打了失败的标了!紧接着它想抛出错误,但是由于被 try catch 了,于是乎正常执行后续的逻辑,等执行到最后,外层要提交事务了,发现当前事务已经被打了回滚的标记,所以提交失败,报了上面的错。我记得以前还听说过一个段子,就是有个人用了一个网上的组件,正常情况下都没事,异常情况下,系统就挂了。

2023-07-12 17:09:49 932 1

原创 SpringCloudAlibaba--独立操作日志组件

概述在单体项目中如果我们需要记录操作日志一般会通过如下手段实现:但是在微服务架构中我们不可能每个服务都写一个自定义注解,再写一个AOP,这很明显违反了 Don’t repeat yourself 精神。所以这时候我们一般都会建立一个公共的组件,在公共组件中完成日志的收集,后端服务只需要引入这个公共的组件即可。这就是今天文章的内容,独立的业务日志收集组件。SpringBoot Starter要实现上述的功能我们需要借助SringBoot Starter来实现,SpringBoot 的一大优势就是Starter

2023-07-12 15:38:46 740

原创 SpringBoot 通用限流方案

SpringBoot 通用限流方案一、背景限流对于一个微服务架构系统来说具有非常重要的意义,否则其中的某个微服务将成为整个系统隐藏的雪崩因素,为什么这么说?举例来讲,某个SAAS平台有100多个微服务应用,但是作为底层的某个或某几个应用来说,将会被所有上层应用频繁调用,业务高峰期时,如果底层应用不做限流处理,该应用必将面临着巨大的压力,尤其是那些个别被高频调用的接口来说,最直接的表现就是导致后续新进来的请求阻塞、排队、响应超时…最后直到该服务所在JVM资源被耗尽。二、限流概述在大多数的微服务架构在

2023-07-12 15:14:34 426

原创 RocketMQ5.0消息存储<五>_文件过期删除机制

若是更新消息时(如:更新消息的延迟重试次数),采用重新写入的方式,而不是直接更新原始消息。RocketMQ清除过期文件的方法是:如果非当前写文件在一定时间间隔内没有再次被更新,则认为是过期文件,可以被删除,不会关注该文件的消息是否全部被消费。RocketMQ操作CommitLog、ConsumeQueue文件是基于内存映射机制并在启动时会加载commitlog、consumequeue目录下的所有文件,为了避免内存与磁盘的浪费,不可能将消息永久存储Broker服务器上,所以需要删除己过期的文件。

2023-07-12 14:03:22 315

原创 RocketMQ5.0消息存储<四>_刷盘机制

org.apache.rocketmq.store.CommitLog.DefaultFlushManager#handleDiskFlush是刷盘核心方法,含有同步、异步刷盘逻辑,如下代码所示。org.apache.rocketmq.store.CommitLog.FlushManager是刷盘管理器接口,其接口的实现类是org.apache.rocketmq.store.CommitLog.DefaultFlushManager刷盘管理器实现类维护刷盘线程执行周期性刷盘操作。开启堆外内存池的刷盘流程。

2023-07-12 13:45:04 311

原创 RocketMQ5.0消息存储<三>_消息转发与恢复机制

如果Broker异常退出,在文件恢复过程中,RocketMQ会将最后一个有效文件中的所有消息重新转发到消息消费队列与索引文件,确保不丢失消息,但同时会带来消息重复的问题。如下所示是的UML图。需要注意的是没有恢复IndexFile文件,原因是有异常的IndexFile在加载过程中被销毁,当恢复时再次转发消息来构建IndexFile,详细见org.apache.rocketmq.store.index.IndexService#load是IndexFile文件加载的核心处理方法,这里不作介绍。

2023-07-12 11:31:38 132

原创 RocketMQ5.0消息存储<二>_消息存储流程

org.apache.rocketmq.broker.processor.SendMessageProcessor是生产者发送消息后,Broker接收消息的核心实现类。创建的内存追加消息。org.apache.rocketmq.store.logfile.DefaultMappedFile#appendMessage是文件内存映射追加消息方法,目的是把堆外缓存池消息或直接Commit到文件内存映射,其调用链如下。step3:消息通过堆外缓存,Commit消息写入文件内存映射,然后Flush写入磁盘;

2023-07-12 10:22:06 131

原创 RocketMQ5.0消息存储<一>_存储文件及内存映射

但是按照消息主题检索消息带来了极大的不便,RocketMQ引入了ConsumeQueue消息队列文件,每个消息主题包含多个消息消费队列(内容相同),每一个消息队列有一个消息文件,其专门为消息订阅构建的索引文件,提高根据主题与消息队列检索消息的速度。ConsumeQueue即为Commitlog文件的索引文件,其构建机制是当消息提交到Commitlog文件的内存映射后,由专门的线程产生消息转发任务,从而构建消息消费队列文件与下文提到的索引文件。如下图所示,每条消息的前面4个字节是该消息的总长度。

2023-07-12 09:36:18 339

原创 RocketMQ5.0消息消费<三> _ 消息消费

参考《RocketMQ5.0.0消息消费<一> _ PUSH模式的消息拉取​》,成功拉取消息后,org.apache.rocketmq.client.consumer.PullCallback回调onSuccess(),把消息提交(异步提交)到ConsumeMessageService的线程池中,供消费者消费,则本次拉取消息完成。org.apache.rocketmq.client.consumer.store.RemoteBrokerOffsetStore是集群模式消费进度存储的实现类,其关键属性如下。

2023-07-10 15:38:43 241

原创 RocketMQ5.0消息消费<二> _ 消息队列负载均衡机制

每个消费者DefaultMQPushConsumerImpl拥有一个RebalanceImpl对象,其中org.apache.rocketmq.client.impl.consumer.RebalanceImpl#doRebalance方法是对消费者的所有订阅主题进行负载均衡,即:消费者的所有订阅主题重新分配一个或多个消费队列来进行消费。org.apache.rocketmq.client.impl.consumer.RebalanceService#run()周期20s执行负载均衡任务。

2023-07-10 14:49:42 926

个人学习资料+后端开发

个人学习资料+后端开发

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关注的人

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