自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 bilibili尚硅谷周阳老师JUC并发编程与源码分析课程笔记第四章——LockSupport与线程中断

指java.util.concurrent.locks.LockSupport类,功能非常强大!首先一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以Thread.stop,Thread.suspend,Thread.resume都已经被废弃了其次在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的协商机制——中断,也即中断标识协商机制。

2024-03-11 09:31:27 991

原创 bilibili尚硅谷周阳老师JUC并发编程与源码分析课程笔记第十三章——ReentrantLock、ReentrantReadWriteLock、StampedLock讲解

*锁降级 ** 下面的示例代码摘自ReentrantReadWriteLock源码中:ReentrantReadWriteLock支持锁降级,遵循按照获取写锁,获取读锁再释放写锁的次序,写锁能够降级成为读锁,不支持锁升级* if (!* }* }* }* try {* }* }* }}代码中声明了一个volatile类型的cacheValid变量,保证其可见性首先获取读锁,如果cache不可用,则释放读锁。

2024-02-22 11:17:17 443

原创 bilibili尚硅谷周阳老师JUC并发编程与源码分析课程笔记第十二章——AbstractQueueSynchronizer之AQS【重要】

AQS同步队列的基本结构有阻塞就需要排队,实现排队必然需要队列AQS自身:state变量+CLH双端队列尝试加索加锁失败,线程入队列线程入队列后,进入阻塞状态。

2024-02-22 11:14:49 991

原创 bilibili尚硅谷周阳老师JUC并发编程与源码分析课程笔记第十一章——Synchronized与锁升级

ps:图片来源于百度,若侵权,联系我删除没有锁:自由自在偏向锁:唯我独尊轻量锁:楚汉争霸重量锁:群雄逐鹿。

2024-02-22 11:05:12 509

原创 bilibili尚硅谷周阳老师JUC并发编程与源码分析课程笔记第十章——Java对象内存布局和对象头

对象头(Header)、实例数据(Instance Data) 和对齐填充(Padding)。

2024-02-22 10:48:48 1039

原创 bilibili尚硅谷周阳老师JUC并发编程与源码分析课程笔记第九章——聊聊ThreadLocal

ThreadLocal中ThreadLocalMap的数据结构和关系?ThreadLocal的key是弱引用,这是为什么?ThreadLocal内存泄漏问题你知道吗?ThreadLocal中最后为什么要加remove方法?返回此线程局部变量的当前线程的“初始值”。该方法将被调用的第一次一个线程访问与可变get()方法,除非线程先前调用的set(T)方法,在这种情况下initialValue方法将不被调用的线程。

2024-02-22 10:40:33 945

原创 bilibili尚硅谷周阳老师JUC并发编程与源码分析课程笔记第八章——原子操作类之18罗汉增强

public final int get() //获取当前的值public final int getAndSet(int newValue) //获取当前的值,并设置新的值public final int getAndIncrement() //获取当前的值,并自增public final int getAndDecrement() //获取当前的值,并自减public final int getAndAdd(int delta) //获取当前的值,并加上预期的值。

2024-02-22 10:29:54 918

原创 bilibili尚硅谷周阳老师JUC并发编程与源码分析课程笔记第七章——CAS

需要记住:CAS是靠硬件实现的从而在硬件层面提升效率,最底层还是交给硬件来保证原子性和可见性实现方式是基于硬件平台的汇编指令,在inter的CPU中,使用的是汇编指令compxchg指令核心思想:比较要更新变量V的值和预期值E,相等才会将V的值设为新值N,如果不相等自旋再来。

2024-02-22 10:22:08 875

原创 bilibili尚硅谷周阳老师JUC并发编程与源码分析课程笔记第六章——volatile与JMM

volatile关键字保证可见性对一个被volatile关键字修饰的变量1写操作的话,这个变量的最新值会立即刷新回到主内存中2读操作的话,总是能够读取到这个变量的最新值,也就是这个变量最后被修改的值3当某个线程收到通知,去读取volatile修饰的变量的值的时候,线程私有工作内存的数据失效,需要重新回到主内存中去读取最新的数据volatile写之前的操作,都禁止重排序到volatile之后volatile读之后的操作,都禁止重排序到volatile之前。

2024-02-22 10:15:56 912

原创 bilibili尚硅谷周阳老师JUC并发编程与源码分析课程笔记第五章——Java内存模型之JMM

我们定义的所有共享变量都储存在物理主内存中每个线程都有自己独立的工作内存,里面保证该线程使用到的共享变量的副本(主内存中该变量的一份拷贝)线程对共享变量所有的操作都必须先在线程自己的工作内存中进行后写回主内存,不能直接从主内存在读写(不能越级)不同线程之间也无法直接访问其他线程的工作内存中的变量,线程间变量值的传递需要通过主内存来进行(同级不能互相访问)。在Java语言里面,Happens-before的语义本质上是一种可见性。

2024-02-22 10:06:31 864

原创 bilibili尚硅谷周阳老师JUC并发编程与源码分析课程笔记第三章——说说Java“锁“事

1-2:一个对象里面如果有多个 synchronized 方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法,其它线程都只能等待。换句话说,某一个时刻内,只能有唯一的一个线程去访问这些synchronized方法。锁的是当前对象this,被锁定后,其它线程都不能进入到当前对象的其它的synchronized方法3-4:加个普通方法后发现和同步锁无关换成两个对象后,不是同一把锁了,情况立即变化5-6: 都换成静态同步方法后,情况又变化。

2024-02-22 10:01:39 995

原创 bilibili尚硅谷周阳老师JUC并发编程与源码分析课程笔记第二章——CompletableFuture

文章目录Future接口理论知识复习Future接口常用实现FutureTask异步任务Future接口能干什么相关接口目的Runnable接口和Callable接口区别Thread类构造方法本源的Future接口相关架构Future接口的继承关系构造方法CodeFuture编码实战和优缺点分析优点案例小总结缺点1案例小总结缺点2案例小总结结论想完成一些复杂的任务回调通知创建异步任务多个任务前后依赖可以组合处理(水煮鱼)对计算速度选最快...CompletableFuture引入CompletableFut

2024-02-22 09:50:35 1061

原创 bilibili尚硅谷周阳老师JUC并发编程与源码分析课程笔记第一章——线程基础知识复习

如果用户线程全部结束意味着程序需要完成的业务操作已经结束了,守护线程随着JVM一同结束工作。

2024-02-21 16:11:44 1098

原创 数据库监控与调优【二十】—— MySQL数据库开发的36条军规

MySQL数据库开发的36条军规核心军规尽量不在数据库做运算控制单表数据量 纯INT不超过10M条,含Char不超过5M条保持表身段苗条平衡范式和冗余拒绝大SQL,复杂事务,大批量任务字段类军规用好数值字段,尽量简化字段位数把字符转化为数字优先使用Enum或Set避免使用Null字段少用并拆封Text/Blob不在数据库中存图片索引类军规谨慎合理添加索引字符字段必须建立前缀索引?不在索引列做运算自增列或全局ID做InnoDB主键尽量不用外键SQL类军规

2023-06-29 22:06:40 275

原创 数据库监控与调优【十九】—— SQL调优实战

如何阅读EXPLAIN结果利用松散索引扫描优化GROUP BY利用STRAIGHT_JOIN强制指定JOIN的顺序利用索引避免排序。

2023-06-29 22:02:37 391

原创 数据库监控与调优【十八】—— Percona Toolkit调优神器安装与使用

怎么使用上面的报表呢?首先,可以使用概要信息,主要关注R/Call,指这条SQL平均每次花费时间;Calls,这个值越多表示调用越频繁,调用越频繁的慢SQL优化的价值就越大;Response time,比例越大说明这条SQL越重要,优化价值越高。找到需要优化的SQL的Query ID再在报表中查找就可针对分析。将日志分析结果存入表中的好处:可以每一个月执行一次这个命令,后续做统计。

2023-06-29 21:10:43 1136

原创 数据库监控与调优【十七】—— 表结构设计优化

三范式带来的好处,就是防止了冗余,一般来说,在设计表时需要遵循三范式。但是实际项目中,一些场景下也需要做一些反模式设计。

2023-06-29 21:00:18 711

原创 数据库监控与调优【十六】—— GROUP BY语句优化与DISTINCT语句优化

处理GROUP BY的三种方式松散索引扫描,性能最好,explain中Extra字段会有Using index for group-by紧凑索引扫描,性能第二,explain中无明显标识临时表,性能最差,explain中会有Using temporaryGROUP BY和DISTINCT语句优化措施:避免临时表,使用松散/紧凑索引扫描。

2023-06-27 22:29:22 313

原创 数据库监控与调优【十五】—— ORDER BY语句优化

通过实验,已经连接到ORDER BY子句那些情况下能够使用索引避免排序,哪些情况下不能,但是不推荐死记硬背,应该具备自己分析的能力,可以写出数据分析或者画出B+Tree数进行分析。当然,如果mysql能够使用索引避免排序,那样,mysql不用对ORDER BY子句进行单独的处理。但是如果实际的sql就是无法使用索引避免排序,此时,mysql就需要针对ORDER BY子句实现排序功能满足需求。这种情况会在Extra字段中展示Using filesort。但是这个字段含义的原理是怎样的?

2023-06-27 22:26:11 923

原创 数据库监控与调优【十四】—— COUNT语句优化

count(*)和count(1)一样count(*)会选择最小的非主键索引,如果不存在任何非主键索引,则会使用主键count(*)不会排除为null的行,而count(字段)会排除对于不带查询条件的count(*)语句,MyISAM引擎以及InnoDB引擎(MySQL >= 8.0.13),都作了优化如果没有特殊需求,尽量使用count(*)

2023-06-27 22:03:04 302

原创 数据库监控与调优【十三】—— LIMIT语句优化

以上方案全都可以用到生产中,如果查询字段能覆盖需求字段,则优先方案一,方案二和方案三为业界最广泛的解决方案。方案四和方案五是针对能获取到起始主键值和结束主键值。方案六则告诉我们sql写得再好不如从业务角度着手。

2023-06-27 21:38:38 277

原创 数据库监控与调优【十二】—— JOIN语句优化

如图,存在三张表,t1、t2、t3,使用NLJ算法,执行过程大概是这样的,先查询t1中符合条件的数据,然后通过for循环遍历这些数据,在循环中查询t2表符合条件的数据,并使用reference key匹配,也就是join中的on条件。假设t3表是存在索引的,从join buffer中读取数据,用t3表的索引和join buffer匹配,筛选出匹配的索引之后,再通过MRR对t3表的主键进行排序,最后再读取t3表的数据。还是之前的三张表,因此,t1是t2的驱动表,t2是t1的被驱动表。

2023-06-27 21:16:48 1004

原创 数据库监控与调优【十一】—— 索引调优技巧

好处:前缀索引可以有效得让索引更小,更加高效,而且对上层应用是透明的,我们的数据库表不需要做任何改造,使用成本低。所以,这是一种比较容易落地的优化方案。坏处:存在局限性,无法做order by、group by;而且无法使用覆盖索引SQL存在多个条件,多个单列索引,会使用索引合并如果出现索引合并,往往说明索引不够合理但是如果SQL暂时没有性能问题,暂时可以不管。

2023-06-27 21:14:12 176

原创 数据库监控与调优【十】—— 索引失效与解决方案

可能导致索引失效的场景索引列不独立。独立是指:列不能是表达式的一部分,也不能是函数的参数使用了左模糊使用OR查询的部分字段没有索引字符串条件未使用’'引起来不符合最左前缀原则的查询索引字段建议添加NOT NULL约束(建议)隐式转换导致索引失效

2023-06-26 22:16:06 249

原创 数据库监控与调优【九】—— 索引数据结构

通过B-Tree树可以有效的把树的高度降下来。树的阶越大树的高度越低,查询的次数也会越少。

2023-06-26 22:14:40 393

原创 数据库监控与调优【八】—— 索引类型

程序猿之间沟通时,经常会聊到各种索引类型,比如你说:“这是一个组合索引”,他说“这是一个聚簇索引”,如果不了解这些术语,很容易鸡同鸭讲,不之所云。再者,面试时,也经常有变态面试官问诸如“MySQL的索引类型有哪些”的无营养问题,所以还是很有必要记录一下的。唯一索引就是在普通索引的基础上增加了数据唯一性的约束,索引列的值必须唯一,允许有NULL值。InnoDB存储引擎的主键索引使用的是聚簇索引,而MyISAM存储引擎使用了非聚簇索引。普通索引是基础的索引,没有任何约束,主要用于提高查询效率。

2023-06-26 22:08:06 244

原创 数据库监控与调优【七】—— MySQL数据库诊断命令

本文基于MySQL 8.0,理论支持MySQL 5.0及更高版本。本文整理了常用的MySQL诊断命令,可以帮助我们了解数据库的运行情况。

2023-06-26 21:57:37 311

原创 数据库监控与调优【五】—— OPTIMIZER TRACE详解

本文基于MySQL 8.0编写,理论支持MySQL 5.6及更高版本。OPTIMIZER_TRACE是MySQL 5.6引入的一项跟踪功能,它可以跟踪优化器做出的各种决策(比如访问表的方法、各种开销计算、各种转换等),并将跟踪结果记录到表中。

2023-06-26 21:52:10 838

原创 数据库监控与调优【六】—— SQL性能分析

EXPLAIN分析SQL它不香吗?如何更加细致分析SQL的性能呢?深入SQL内部分析性能!

2023-06-26 21:48:02 686

原创 数据库监控与调优【四】—— EXPLAIN详解

EXPLAIN命令是查看MySQL查询优化器如何执行查询的主要方法,可以很好地分析SQL语句的执行情况。每当遇到执行慢的SQL,就可以使用EXPLAIN命令来检查SQL的执行情况,并根据运行结果进行分析,采用相应的方法对SQL语句进行优化。表的读取顺序数据读取操作的操作类型哪些索引可以使用哪些索引被实际使用表之间的引用每张表有多少行被优化器查询。

2023-06-26 21:47:52 707

原创 数据库监控与调优【二】—— 测试数据准备与数据操作工具

使用MySQL官方测试数据库——employee-data下载项目,将项目传到服务器的/opt目录下导入employees.sql语句检查导入是否正确(其实就是集成测试工具)

2023-06-26 21:38:04 346

原创 数据库监控与调优【一】—— 数据库调优的维度

数据库调优时,可以从这7个维度出发,并且尽量在金字塔的底部做优化。从而获得更好的投入产出比。

2023-06-26 21:32:47 372

原创 数据库监控与调优【三】—— 慢查询日志与分析

本文基于MySQL 8.0,理论支持MySQL 5.0及更高版本。

2023-06-26 21:29:29 421

原创 Java实现集合转树

【代码】Java实现集合转树。

2023-06-19 19:35:41 256

原创 分布式消息队列-RabbitMQ从入门到精通

服务解耦:服务的拆分和隔离是业务层面的划分,拆分之后如何通信要看服务之间的依赖性是强依赖还是弱依赖,如果是强依赖,可以采用直连方式,比如:同步dubbo、同步http、同步springcloud调用等,如果是弱依赖,可以使用消息队列做消息解耦。需要注意的是弱依赖不代表可以失败,如果说弱依赖不能失败,比如上游服务做消息发送MQ,下游服务一定要收到这条消息并处理,此时就需要上有服务作可靠性的投递,后续会介绍。削峰填谷:如果在生产环境中,有一些即时性很高、流量很大的应用场景,比如:秒杀、大促等,如何对应用服务作抗

2023-05-22 16:00:32 208

原创 Java中的位运算

Java中,一个int的长度始终是32位,也就是4个字节,它操作的都是该整数的二进制数。也可作用于以下类型,即 byte,short,char,long(它们都是整数形式)。A:我当时遇到这个面试题的时候也是懵的,不知道这题的考点是啥,直接回答:创建一个临时变量,把其中一个变量赋值给临时变量,然后再把另一个变量赋值给这个变量,最后把临时变量赋值给另一个变量。实际采用位运算的方式是性能最好的,因为计算机对于计算数据的话,都是以二进制来进行运算的,所以使用位运算相比直接使用(+、-、

2023-05-09 10:27:18 3502

原创 这可能是你看过最详细的Java集合篇【二】—— LinkedList

LinkedList底层数据结构是双向链表。链表数据结构的特点是每个元素分配的空间不必连续、插入和删除元素时速度非常快、但访问元素的速度较慢。可以存储null值。线程不安全。可以看到,LinkedList同时实现了List接口和Deque对口,也就是它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(stack),这样看来,LinkedList简直就是无敌的,当你需要使用栈或者队列时,可以考虑用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类,更遗憾

2023-04-25 16:21:12 795

原创 这可能是你看过最详细的Java集合篇【一】—— ArrayList

List集合的特点:存储元素有序、可重复、有索引,有序是指存进去和取出来的顺序相同。ArrayList底层数据结构是动态数组。可以存储null值。线程不安全。ArrayList因为有索引,所以通过索引查改快,时间复杂度是O(1),但是增删慢。可以看到,ArrayList 继承了 AbstractList 抽象类,AbstractList 抽象类官方解释:这个抽象类提供了List的接口实现,以最大限度地减少实现该接口所需的工作量,该接口由“随机访问”数据存储(如数组)支持。对于顺序访问数据(如链表),应该优先

2023-04-25 16:19:04 902

原创 MyBatis中#{}和${}的区别

数据库接收到sql语句后,需要词法/语法解析,优化sql语句,制定执行计划。多数情况下,相同的sql语句可能只是传入参数不同(如where条件后的值不同…)。如果每次都需要经过上面的词法/语法解析、语句优化、制定执行计划等,则效率就明显不行了。所以预编译的优势就体现出来了。预编译语句在被MySQL编译器编译后,执行代码会被缓存下来。那么下次调用时,只要是相同的预编译语句就再不需要编译,只要将参数直接传入编译过的语句执行代码中即可。

2023-04-17 10:33:40 202

原创 Java中常见的几种分布式锁介绍及实战应用

锁在JAVA中是一个非常重要的概念,尤其是在当今的互联网时代,高并发的场景下,更是离不开锁。那么锁到底是什么呢?在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制。锁旨在强制实施互斥排他、并发控制策略。咱们举一个生活中的例子:大家都去过超市买东西,如果你随身带了包呢,要放到储物柜里。咱们把这个例子再极端一下,假如柜子只有一个,现在同时来了3个人A,B,C,都要往这个柜子里放东西。这个场景就构造了一个多线程,多线程自然离不开锁。

2023-04-16 21:55:09 2895

空空如也

空空如也

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

TA关注的人

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