- 博客(113)
- 资源 (5)
- 收藏
- 关注
原创 【Java多线程】8——CompletableFuture
在Future接口下,我们只能通过调用get()方法来获取任务计算结果,但是只要目标任务没有执行完,get()方法会被阻塞——阻塞方式又回到了同步调用,这就和异步操作的初衷相违背了。从实现类的版本情况能看出,
2024-03-30 19:19:46
470
原创 【Java多线程】7——阻塞队列&线程池
在《阿里巴巴Java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显式的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了资源的开销。同时线程池不允许使用Executors去创建,而要通过方式,这一方面是由于JDK 中 Executor 框架虽然提供了如等创建线程池的方法,但都有其局限性,不够灵活;使用有助于大家明确线程池的运行规则,创建符合自己的业务场景需要的线程池,避免资源耗尽的风险。
2024-03-30 19:16:46
1384
原创 【Java多线程】5——Lock底层原理
根据类的名字抽象的队列式同步器。AQS 定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它。它维护了一个(代表共享资源)和一个 FIFO 线程等待队列(多线程争用资源被阻塞时会进入此队列)。这里 volatile 是核心关键词。getState()setState()Exclusive(独占,只有一个线程能执行)Share(共享,多个线程可同时执行)不同的自定义同步器争用共享资源的方式也不同。
2024-03-29 16:12:39
1027
原创 【Java多线程】4——特定场景解决办法
使用 Fork Join 框架能够帮助我们把一个大型任务,根据一定规律,拆分成小任务执行。如果拆分后的任务还不够小,可以以递归模式继续拆分,直到拆分到可以执行的程度。然后再把各个子任务执行的结果汇总到一起。Fork:拆分:把大任务拆分成小任务。Join:合并:把小任务执行的结果合并到一起。我们使用 Fork Join 框架只需要继承 RecursiveTask,然后重写 compute() 方法即可。任务拆分的逻辑任务拆分的操作:调用 fork() 方法。
2024-03-28 14:54:30
919
原创 【Java多线程】3——Lock API控制多线程
在实际场景中,读操作不会改变数据,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。针对这种场景,Java 的并发包提供了读写锁,它表示两个锁,一个是读操作相关的锁,称为读锁,这是一种共享锁;一个是写相关的锁,称为写锁,这是一种排他锁,也叫独占锁、互斥锁。
2024-03-28 14:37:51
938
原创 【Java多线程】2——synchronized底层原理
为了减少获得锁和释放锁带来的性能消耗,引入了『偏向锁』和『轻量级锁』的概念。升级后锁一共有 4 种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。
2024-03-27 19:40:37
1177
原创 【Java多线程】1——多线程知识回顾
在一个进程中,需要同时处理多个不同任务,每一个任务由一个线程来执行。从这个意义上来说,可以把进程看做是线程的容器。
2024-03-27 19:31:55
829
原创 【消息队列】——Kafka入门一篇就够了!
Kafka 是一种分布式的,基于发布 / 订阅的消息系统。以时间复杂度为 O(1) 的方式提供消息持久化能力,即使对 TB 级以上数据也能保证常数时间复杂度的访问性能;高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒 100K 条以上消息的传输;支持 Kafka Server 间的消息分区,及分布式消费,同时保证每个 Partition 内的消息顺序传输;同时支持离线数据处理和实时数据处理;Scale out:支持在线水平扩展;
2024-03-26 14:09:00
2157
原创 【分布式】——降级&熔断&限流
什么是熔断,什么是降级,熔断与降级是同一个意思吗?如上图所示,服务A接收客户端请求,服务B提供给内部服务调用,每个服务部署的节点数至少两个。在事发之前的近一周,服务B都一直运行正常,而事发的那晚请求量突增一倍,显然,此次事故与请求突增脱不了干系。因突增请求导致服务B高负荷运转,超出临界点的请求最后超出设定的接口超时时间,再由于服务B的一个隐藏性能问题导致内存消耗殆尽,进程开始频繁GC,但服务A还是不断地往服务B发送请求,导致服务B奔溃,服务B的奔溃又直接导致服务A。
2024-03-26 13:57:34
1057
原创 【分布式】——分布式事务
整个 2PC 的事务流程涉及到三个角色 AP、RM、TM。AP 指的是使用 2PC 分布式事务的应用程序;RM 指的是资源管理器,它控制着分支事务;TM 指的是事务管理器,它控制着整个全局事务。(1)在准备阶段RM 执行实际的业务操作,但不提交事务,资源锁定(2)在提交阶段TM 会接受 RM 在准备阶段的执行回复,只要有任一个RM执行失败,TM 会通知所有 RM 执行回滚操作,否则,TM 将会通知所有 RM 提交该事务。提交阶段结束资源锁释放。
2024-03-25 23:32:09
1094
原创 【分布式】——CAP&BASE理论
BASE 是Basically Available(基本可用)、**Soft state(软状态)**和 **Eventually consistent (最终一致性)**三个短语的缩写。BASE 理论是对 CAP 中 AP 的一个扩展,通过牺牲强一致性来获得可用性,当出现故障允许部分不可用但要保证核心功能可用,允许数据在一段时间内是不一致的,但最终达到一致状态。满足BASE理论的事务,我们称之为“柔性事务。
2024-03-25 23:24:06
1056
原创 【RPC】—Protobuf编码原理
Protobuf的编码是基于变种的Base128的,在学习Protobuf编码或者是Base128之前,先来了解下Base64编码。
2023-07-04 20:38:52
1175
原创 【RPC】—Protobuf入门
在IM应用中,优化数据流量消耗过多的基本方法就是使用高度压缩的通讯协议,而数据压缩后流量减小带来的自然结果也就是省电:因为大数据量的传输必然需要更久的网络操作、数据序列化及反序列化操作,这些都是电量消耗过快的根源。当前IM应用中最热门的通讯协议无疑就是Google的Protobuf了,基于它的优秀表现,微信和手机QQ这样的主流IM应用也早已在使用它。什么是 Google Protocol Buffer?
2023-07-04 20:35:31
1205
原创 缓存三击-缓存穿透、缓存雪崩、缓存击穿
Redis作为目前使用最广泛的缓存,但在实际开发中会面临缓存异常,分别是缓存雪崩、缓存击穿和缓存穿透,这三种异常会导致大量请求从缓存转移到数据库,如果请求的并发量很大就会导致数据库崩溃。
2023-06-30 17:50:36
1047
原创 缓存穿透-布隆过滤器
如果是网络恶意攻击(每次key不一样,且数据库不存在),缓存占用了更多的内存;缓存空对象要考虑到缓存时间的设置。这时候设置一个较短的过期时间(通常设定的缓存过期为60秒),就会自动剔除这些键。如果过期时间设置的过大,数据库在此期间正好添加了该数据,就会出现数据不一致场景;通过消息系统或者其它方式来清除缓存中的空对象。而另一种方式就是使用布隆缓存器!
2023-06-30 17:45:07
422
原创 Java新特性-Optional
从 Java 8 引入的一个很有趣的特性是Optional类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。Optional是 Java 语言的有益补充 —— 它旨在减少代码中的。
2023-06-30 17:41:32
339
原创 Java新特性-stream()
在JAVA中,涉及到对数组Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理。在JAVA7及之前/*** 【常规方式】* 从给定句子中返回单词长度大于5的单词列表,按长度倒序输出,最多返回3个* @param sentence 给定的句子,约定非空,且单词之间仅由一个空格分隔* @return 倒序输出符合条件的单词列表。
2023-06-30 17:40:15
242
原创 Java新特性-Functon接口
为了更好的将函数作为参数,Java遂引入了Function接口。super V ,?super R ,?} }有一个抽象方法,暗示可以使用λ\lambdaλ表达式;该接口会接收一个参数,且会产生结果;在使用这个接口前需要明确定义参数类型和返回的结果类型(Java的泛型就是这么回事);里面有一个apply方法将会对参数进行操作,并返回结果;因为是函数式接口(),可以通过lambda表达式实现该接口;总之,要分清当前function,也就是当前对象,判断执行顺序。
2023-06-30 17:38:49
222
原创 【SSM整合】2—Spring和SpringMVC整合
Github主页👉笔记链接👉Spring专栏👉SpringMVC专栏👉Mybatis专栏👉如果可以,麻烦各位看官顺手点个star~😊。
2023-04-10 00:07:11
401
2
原创 【SSM整合】1—Spring和Mybatis整合
Github主页👉笔记链接👉Spring专栏👉SpringMVC专栏👉Mybatis专栏👉如果可以,麻烦各位看官顺手点个star~😊。
2023-04-10 00:06:58
398
原创 【SSM整合】3—分页
Github主页👉笔记链接👉Spring专栏👉SpringMVC专栏👉Mybatis专栏👉如果可以,麻烦各位看官顺手点个star~😊。
2023-04-10 00:04:43
478
原创 【SpringMVC】10—其他概念
在实际开发过程中,难免会有某些情况需要使用自定义类型转换器。因为我们自己自定义的类型在 SpringMVC 中没有对应的内置类型转换器。此时需要我们提供自定义类型来执行转换。;泛型S:源类型(本例中是String类型)泛型T:目标类型(本例中是Address类型)// 1.按照约定的规则拆分源字符串 String [ ] split = source . split(",");
2023-04-09 23:31:25
1109
原创 【SpringMVC】9—底层原理
本质上是一个Servlet,所以天然的遵循Servlet的生命周期。所以宏观上是Servlet生命周期来进行调度;的父类是负责框架本身相关的创建和初始化;负责请求处理相关的初始化;创建 IOC 容器对象之后会存入应用域;完成初始化会调用 IOC 容器的刷新方法;刷新方法完成触发刷新事件,在刷新事件的响应函数中,调用的初始化方法;在的初始化方法中初始化了请求映射等;
2023-04-09 23:27:55
951
原创 【SpringMVC】3—RESTFul风格
ReStateTransfer,表现层资源状态转移。定位:互联网软件架构风格;倡导者:Roy Thomas Fielding;文献:Roy Thomas Fielding的博士论文;在HTML中,GET和POST请求可以天然实现,但是DELETE和PUT请求无法直接做到。SpringMVC提供了帮助我们将POST请求转换为DELETE或PUT请求。
2023-04-09 23:14:12
934
原创 【SpringMVC】2—传统方式实现增删改查
⭐⭐⭐⭐⭐⭐Github主页👉https://github.com/A-BigTree笔记链接👉https://github.com/A-BigTree/Code_Learning⭐⭐⭐⭐⭐⭐如果可以,麻烦各位看官顺手点个star~😊如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆
2023-04-09 23:08:56
746
原创 【SpringMVC】1—SpringMVC基础操作
SpringMVC是Spring为表述层开发提供的一整套完备的解决方案。在表述层框架历经、、等诸多产品的历代更迭之后,目前业界普遍选择了SpringMVC作为项目表述层开发的首选方案。
2023-04-09 23:06:00
520
原创 【Mybatis】6—逆向工程&其他概念
当某个具体类型 Mybatis 靠内置的类型处理器无法识别时,可以使用 Mybatis 提供的自定义类型处理器机制。第一步:实现接口或者继承类;第二步:指定其映射某个JDBC类型(可选操作);第三步:在Mybatis全局配置文件中注册;// 1.从结果集中获取原始的地址数据 String addressOriginalValue = resultSet . getString(columnName);
2023-04-08 00:03:36
849
原创 【Mybatis】5—缓存
先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用;如果二级缓存没有命中,再查询一级缓存;如果一级缓存也没有命中,则查询数据库;SqlSession关闭之前,一级缓存中的数据会写入二级缓存;官网地址:https://www.ehcache.org/
2023-04-08 00:03:26
463
原创 【Spring】4—声明式事务
为了在特定领域帮助我们简化代码,Spring封装了很多『Template』形式的模板类。等等,包括我们今天要学习的。对一个查询操作来说,如果我们把它设置成只读,就能够明确告诉数据库,这个操作不涉及写操作。这样数据库就能够针对查询操作来进行优化。我们在事务传播行为这里,使用属性,也可以说是让不同事务方法从事务的使用上解耦合,不要互相影响。
2023-04-08 00:01:37
679
原创 【Spring】3—AOP面向切面编程
二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来——解耦。调用目标方法时先调用代理对象的方法,减少对目标方法的调用和打扰,同时让附加功能能够集中在一起也有利于统一维护。虽然我们上面介绍过的切入点表达式语法细节很多,有很多变化,但是实际上具体在项目中应用时有比较固定的写法。典型场景:在基于 XML 的声明式事务配置中需要指定切入点表达式。
2023-04-08 00:01:29
407
原创 【Spring】2—IOC容器
是Spring提供的一种整合第三方框架的常用机制。和普通的bean不同,配置一个类型的bean,在获取 bean的时候得到的并不是class属性中配置的这个类的对象,而是方法的返回值。通过这种机制,Spring可以帮我们把复杂组件创建的详细过程和繁琐细节都屏蔽起来,只把最简洁的使用界面展示给我们。将来我们整合Mybatis时,Spring 就是通过机制来帮我们创建对象的。
2023-04-08 00:01:20
1503
原创 【Spring】1—Spring简介
Spring的基础框架,可以视为Spring基础设施,基本上任何其他Spring项目都是以Spring Framework为基础的。
2023-04-08 00:01:11
959
原创 【Mybatis】4—动态SQL
Mybatis框架的动态SQL技术是一种 根据特定条件动态拼装SQL语句 的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。MyBatis的一个强大的特性之一通常是它的动态SQL能力。
2023-04-07 19:06:33
1123
python食物数据爬取及分析(源码、爬取数据、数据可视化图表、报告)
2022-01-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人