- 博客(37)
- 收藏
- 关注
原创 JUC之AQS
AbstractQueuedSynchronizer 是用来实现锁或者其他同步器组件的公共基础部分的抽象实现,是重量级基础框架及整个JUC体系的基石,主要用于解决锁分配给谁的问题。统一规范并简化了锁的实现,将其抽象出来屏蔽了同步状态管理,同步队列的管理和维护、阻塞线程队列和通知、唤醒机制等,是一切锁和同步组件实现的--------公共基础部分。unparkSuccessor 头节点唤醒后继节点,B节点占位成功,B节点的之前的前驱节点虚拟节点出队,B节点的thread设置为null,变为新的虚拟头节点。
2024-03-17 11:15:20
349
原创 JUC之ThreadLocal
当前栈帧出栈,当前栈帧对应的threadlocal对象也应当被销毁,如果是强引用,该threadlocal对象就不会被回收,从而发生内存泄漏,从而key与threadlocal对象为弱引用。且该副本只由当前线程自己使用。既然其他Thred不可访问,那就不存在多线程间共享的问题。统一设置初始值,但是每个线程对这个值的修改都是各自线程互相独立的。1.加入synchronized 或者Lock控制资源的顺序访问。2.人手一份,大家各自安好,没必要抢夺。如果不清空,值会变的越来越大。因为每个Thred内有自己的。
2024-03-16 17:14:20
381
原创 JUC之CAS比较并交换
实现方式是基于硬件平台的汇编指令,在intel的CPU中(X86机器上),使用的是汇编指令cmpxchg指令。unsafe中的do-while保证自旋。native修饰的方法代表的是底层的方法。加入原子整型类的操作后,无锁化的操作。版本号不一致,t4线程没有修改成功。2.引出来ABA问题?1.循环时间长开销很大。UnSafe源码分析。ABA后版本号有变化。ABA多线程demo。
2024-03-16 12:51:56
359
原创 JUC之volatile关键字
可见性有序性(禁止指令重排)写指令读指令字节码层面内存屏障是什么?内存屏障: 是一种屏障指令,它使得CPU或者编译器对屏障指令的前和后所发出的内存操作,执行一个排序的约束。也叫内存栅栏或栅栏指令内存屏障能干嘛阻止屏障两边的指令重排序,写数据时加入屏障,强制将线程私有工作内存的数据刷回主物理内存。读数据时加入屏障,线程私有工作内存的数据失效,重新到主物理内存中获取最新数据。内存屏障的四大指令1.在每一个volatile写操作前面插入一个StoreStore屏障。
2024-03-16 10:47:52
469
原创 JUC之JMM
两个操作之间存在happens-before关系,并不意味着一定按照happens-before原则制定的顺序来执行。如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。多线程环境中线程交替进行,由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的,结果无法预测。原子性:指一个操作是不可打断的,即多线程的环境下,操作不能被其他线程干扰。Java内存模型JMM。处理器在进行重排序时,
2024-03-13 22:22:22
377
原创 JUC之Synchronized
换句话说,某一个时刻内,只能有唯一的一个线程去访问synchronized方法,锁的是当前对象this,被锁定后,其他的线程都不能进入到当前对象其他的synchronized方法。具体实例对象this和唯一模板class,这两把锁是两个不同的对象,所以静态同步方法与普通同步方法之间是不会有竞态条件的,但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁。对于普通同步方法,锁的是当前实例对象,通常指this,所有的普通同步方法用的都是同一把锁,实例对象本身。
2024-03-13 07:00:00
1625
原创 Mysql学习之MVCC解决读写问题
MVCC (Multiversion Concurrency Control)多版本并发控制。顾名思义,MVCC是通过数据行的多个版本管理来实现数据库的。
2024-03-02 18:45:31
1037
1
原创 Mysql学习之各种锁
而且如果对一条记录加了gap锁(不论是共享gap锁还是独占gap锁),并不会限制其他事务对这条记录加记录锁或者继续加gap锁。读取操作本身不会对记录由有任何的影响,并不会引起什么问题,所以允许这种情况的发生。从对待锁的态度来看锁的话,可以将锁分为乐观锁和悲观锁,从名字可以看出这两种锁是两种看待。两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会释放自己的锁。读-写或写-读,即一个事务进行读取操作,另一个进行改动操作,需要注意的是,乐观锁和悲观锁并不是锁,而是锁的。,加锁会比较慢,容易。
2024-03-02 14:10:56
910
原创 Mysql学习之事务日志undolog深入剖析
在InnoDB中,事务中的Delete操作实际上并不是真正的删除掉数据行,而是一种Delete Mark操作,在记录上标识Delete_Bit,而不删除记录,是一种假删除,只是做了一个标记,真正的删除工作需要后台purge线程去完成。undo log会产生redo log,也就是undo log的产生会伴随着redo log的产生,这是因为undo log也需要持久性的保护。以上情况出现,需要把数据改回原来的样子,这个过程称之为回滚,这样就可以造成一个假象:这个事务看起来什么都没做,所以符合。
2024-02-26 22:05:14
398
原创 Mysql学习之事务日志redolog深入剖析
比如对某一行数据进行了INSERT的操作,那么undo log就记录一条与之相反的DELETE操作。这里的日志就是redo log.当发生宕机且数据未刷到磁盘的时候,可以通过redo log来恢复,,通过缓冲池来优化CPU和磁盘之间的鸿沟,这样可以保证整体的性能不会下降的太快。,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。也就是说,一个没有提交事务的redo log记录,也可能会刷盘。,回滚行记录到某个特定的版本,用来保证事务的原子性、一致性。(undo log记录的是每个修改操作的。
2024-02-26 07:00:00
804
原创 MySQL数据库调优之关联查询、排序查询、分页查询、子查询、Group by优化
一个常见又比较头疼的问题就是limit 2000000,10 此时,需要mysql排序前20000010条记录,仅仅返回2000000-20000010的记录,其他记录丢弃,查询排序的代价非常的大。两种算法的数据都有可能超出sort_buffer_size的容量,超出之后,会创建tmp文件进行合并排序,导致多次I/0,但是用单路排序的风险更大一些,所以要。但总的来说,我们还是要避免,以提高查询效率。不一定,优化器会根据你查询语句做优化,决定先查那张表,先查询的那张表就是驱动表,反之就是被驱动表。
2024-02-24 17:34:56
973
原创 MySQL数据库调优之 explain的学习
定位了查询慢的SQL后,就可以使用explain或describe工具做针对性的分析查询语句。describe语句的使用方法与explain语句是一样的,并且分析结果也是一样的。Mysql中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算饭呢西系统中收集到的统计信息,为客户端请求的Qurey 提供它认为最优的。
2024-02-20 16:57:18
821
原创 Sentinel 学习02-隔离降级
给 UserClient的查询用户接口设置降级规则**,慢调用的RT阈值为50ms**,统计时间为1秒,最小请求数量为5,,统计最近10000ms内的请求,如果请求量超过10次,并且慢调用比例不低于0.5,则触发熔断,由于微服务中的服务远程调用,是通过Feign来实现的,由此引出Feign整合Sentinel。给 UserClient的查询用户接口设置降级规则,统计时间为1秒,最小请求数量为5,失。jemeter中没有异常,因为会走前面返回空用户的降级逻辑,所以没有抛出相关的异常。
2024-02-17 11:02:41
924
原创 Sentinel 学习01-流控规则
默认情况下sentinel会监控Spring MVC的每一个端点**(Controller中的每一个方法)**,因此SpringMVC的每一个端点就是调用链路中的一个资源。3.在OrderController中添加一个/order/save的端点,调用OrderService的queryGoods方法。流控、熔断等都是针对簇点链路中的资源来设置的,可以点击对应的资源后面的按钮来设置对应的规则。write的资源访问超过阈值的时候,会对read进行限流,避免影响write的资源。
2024-02-17 02:11:35
978
原创 SpringCloud GateWay 学习
关键代码逻辑是实现RouteLocator接口,该接口的实现可以通过RouteLocatorBuilder 类中的routes 定义若干个route,route中含有两个参数,一个是route的id,一个是函数Function,可以通过链式编程依次实现断言、URI等参数的注入。从之前的配置可以看出,URL的配置项是写死的,这不符合微服务的要求。Zuul2.0 性能好 NIO。API 网关的作用就是把各个服务对外提供的API汇聚起来,让外界看起来是一个统一的入口,同时也可以在网关中提供额外的功能。
2024-02-16 07:30:00
1852
原创 MySQL数据库索引的学习
理解方式1:索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个行,毕竟索引叶子节点存储了他们索引的数据,当能通过读取索引就可以找到想要的数据,那就不需要读取行了,列的基数指的时某一列中不重复数据的个数,比如某个列的包含值2,5,8,2,5,8,2,5,8,虽然有9条记录,但该列的基数却是3.也就是说,这个列的基数指标非常重要,直接影响到我们是否能有效的利用索引,最好为列的基数大的列建立索引,为基数小的列建立索引的效果可能不好。问题是,截取多少呢?
2024-02-05 09:30:02
853
原创 canal 数据同步架构图
canal 数据同步主要用到的组件有canal server以及canal adapter,一般mysql的数据同步可以通过以下的同步流程。
2023-12-28 16:41:53
388
原创 SpringMVC框架学习2
1.SSM整合1.1 流程分析 (1) 创建工程 创建一个Maven的web工程 pom.xml添加SSM需要的依赖jar包 编写Web项目的入口配置类,实现AbstractAnnotationConfigDispatcherServletInitializer 重写以下方法:getRootConfigClasses() :返回Spring的配置类->需要SpringConfig配置类 getServletConfigClasses() :返回SpringMVC的配置类-&
2022-06-05 14:18:01
91
原创 SpringMVC 框架学习
1,SpringMVC概述 在web程序大都基于三层架构来实现。 三层架构:浏览器发送一个请求给后端服务器,后端服务器现在是使用Servlet来接收请求和数据 如果所有的处理都交给Servlet来处理的话,所有的东西都耦合在一起,对后期的维护和扩展极为 不利,将后端服务器Servlet拆分成三层,分别是web、service和dao web层主要由servlet来处理,负责页面请求和数据的收集以及响应结果给前端 service层主要负责业务逻辑的处理 dao层主要负责.
2022-05-22 00:35:33
309
原创 Canal框架应用的基础学习
引入背景原理:业务情景其中,MySQL与ES存储的数据结构是完全不同的,也即异构数据(异构数据指的结构不同的数据)。异构数据也会伴随着组织与结构的不同,比如前台与后台的划分。如果商户中新增数据,传统的做法一般就是在Java代码中新增MySQL数据时向调用团队B同步接口新建ES商品数据,这里往往涉及到多团队协作。这时,工作中会产生强烈的耦合现象。团队A与团队B的协作产生代码的强耦合。团队A必须了解团队B提供的结构才可以实现,但本身这并不属于团队A的工作范畴。同时,会有扩展困难的问题。比如团队C维护的Mon
2022-01-19 09:35:31
302
原创 Mybatis中的错误解析:Mapped Statements collection does not contain value for com.XXXXXX
```javaorg.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.atguigu.mybatis.dao.EmployeeMapperPlus.getEmpsByDeptId ### Th.
2021-12-07 16:47:48
1737
原创 Camel in action Routing with Camel(第二章学习笔记)
本章概述路由概述介绍 Rider Auto PartsFTP和JMS端点的基础知识使用Java DSL创建路由在XML中配置路由路由使用循环路由概述路由发生在日常生活的许多方面。例如,当你寄信时,在到达最终地址之前,可能要经过几个城市。你发送的电子邮件在到达最终目的地之前会经过许多计算机网络系统。在所有情况下,路由器的功能是有选择地向前移动消息。在企业消息传递系统的上下文中,路由是将消息从输入队列中取出,并根据一组条件将其发送到几个输出队列中的一个的过程,如图2
2021-11-02 08:25:44
228
原创 LeetCode 231. 2 的幂的
题目描述:给你一个整数 n,请你判断该整数是否是 2 的幂次方。思路:一个数 n 是 2 的幂,当且仅当 n 是正整数,并且 n 的二进制表示中仅包含 1个 1。因此我们可以考虑使用位运算,将 n 的二进制表示中最低位的那个 1 提取出来,再判断剩余的数值是否为 00 即可。代码:class Solution { public boolean isPowerOfTwo(int n) { return n>0 && (n&(n-1))==0;
2021-10-28 12:36:41
3689
原创 leetcode3无重复字串的最长长度
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。思路:利用滑动窗口法进行解决代码:class Solution { public int lengthOfLongestSubstring(String s) { // 哈希集合,记录每个字符是否出现过 HashSet<Character> occ =
2021-10-22 09:02:15
71
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人