- 博客(74)
- 资源 (1)
- 收藏
- 关注

原创 MySQL-锁-间隙锁案例篇
间隙加锁规则原则1:加锁的基本单位是next-key lock。希望你还记得,next-key lock是前开后闭区间。原则2:查找过程中访问到的对象才会加锁。优化1:索引上的等值查询,给唯一索引加锁的时候,next-key lock退化为行锁。优化2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock退化为间隙锁。一个bug:唯一索引上的范围查询会访问到不满足条件的第一个值为止。注意!有行才会加行锁。如果查询条件没有命中行,那就加next-key l
2021-01-21 12:59:59
984

原创 LongAdder源码学习
LongAdder 更适合做全局计数统计。而AtomicLong适合做自增,因为他能累加并实时返回值,而LongAdder统计的值时近实时。AtomicLong 由于一直通过cas自旋修改值,在高并发情况下会有很多线程处于自旋,而LongAdder 利用空间换时间的方式把要增加的值先放另一边。
2020-09-29 14:51:56
117

原创 HashMap 常见问题Java8(扩容、转红黑树、退化链表、Hash优化)
HashMap扩容HashMapHashMap树化HashMap退化链表HashMap hash优化HashMap put过程HashMap 转红黑树条件HashMap 循环异常 ConcurrentModificationException红黑树、链表
2020-09-05 17:18:45
11235
10
原创 自考-信息资源管理02378
计算机信息资源管理-计算机科学与技术最后一个科目信息资源管理整理的资料考了3次终于考过了。如果有朋友需要可以拿去,我整理的资料,需要的拿走下载地址
2021-04-30 11:52:16
1125
1
原创 ThreadPoolExecutor源码学习
属性字段说明//高3位:表示当前线程池运行状态 除去高3位之后的低位:表示当前线程池中所拥有的线程数量 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); //表示在ctl中,低COUNT_BITS位 是用于存放当前线程数量的位。 private static final int COUNT_BITS = Integer.SIZE - 3; //低COUNT_BITS位 所能表达
2021-01-22 13:35:29
113
原创 ThreadLocal源码学习
基本结构图片每个Thread 维护一个 ThreadLocalMap 映射表,这个映射表的 key 是 ThreadLocal实例本身,value 是真正需要存储的 Object所以ThreadLocal只有key的引用在 每个线程里面也就是说 ThreadLocal 本身并不存储值,它只是作为一个 key 来让线程从 ThreadLocalMap 获取 value真正存数据的是Thread 的局部变量 threadLocals 的ThreadLocalMap里面的entry对象的value
2021-01-22 13:33:38
119
原创 Condition源码学习
总体Condition产生的图signal() 唤醒队列是从condition阻塞队列取第一个 ,不过是放进AQS队列的队尾, 并且入队后会判断是否需要挂起condition队列node 进入AQS队列后 会判断上一个节点是否为head节点 然后尝试加锁 否则依然会挂起condition队列的node状态是CONDITION=-2await是会阻塞当前线程并且会完全释放锁,然后唤醒AQS头结点来获取锁。也就是阻塞在lock外面的线程。condition队列存储的就是曾经获取到锁,但是awai
2021-01-22 13:33:06
165
原创 SynchronousQueue源码学习
SynchronousQueue 是实现了BlockingQueue的一个队列。特点是SynchronousQueue 没有容器。在生产者消费者情况下。生产者生产数据后没人消费是会阻塞的。当有消费者消费了,消费者与生产者同时退出队列。SynchronousQueue 的两种实现方式公平模式 就是队列 TransferQueue非公平模式 就是栈 TransferStackTransferer 抽象类不管非公平还是公平都是这个抽象方法来实现的数据交换abstract static.
2021-01-22 13:32:36
166
原创 MySQL-索引基本学习
InnoDB索引结构每个页里面有最大和最小记录标识record_type=2,3record_type=1是目录项 0是最终存储记录项一个页16kb=16384字节 可以存很多记录了基本3层就已经很多条记录了每个节点的左儿子小于父节点,父节点又小于右儿子索引每个节点的数据是已经排序好了的,当然如果你是联合索引,那也是排序好了的。索引的代价空间问题每建立一个索引都要为它建立一棵B+树,每一棵B+树的每一个节点都是一个数据页,一个页默认会占用16KB的存储空间,一棵很大的B+树由许多数据页
2021-01-22 09:53:44
151
原创 MySQL-一些问题
优化器未使用你想用的索引select * from t force index(a) where a between 10000 and 20000;// 利用参数force index前缀索引直接创建完整索引,这样可能比较占用空间;创建前缀索引,节省空间,但会增加查询扫描次数,并且不能使用覆盖索引;count区别MyISAM索引结构的优势count快就不说了而Innodb由于MVCC与可重复读的原因速度会相对慢点count(*)、count(主键id)和count(1) 都表示返回
2021-01-22 09:53:35
117
原创 MySQL-索引-索引合并学习
MySQL在一般情况下执行一个查询时最多只会用到单个二级索引,但是,在这些特殊情况下也可能在一个查询中使用到多个二级索引,设计MySQL的把这种使用到多个索引来完成一次查询的执行方法称之为:index merge所有的索引合并往往还是需要看数据回表的数量与 mysql 的优化器!优化器只有在单独根据搜索条件从某个二级索引中获取的记录数比较少,通过Union索引合并后进行访问的代价比全表扫描更小时才会使用Union索引合并Intersection合并Intersection翻译过来的意思是交集。这.
2021-01-21 12:58:10
202
原创 MySQL-日志学习
1. 更新数据前 会把数据写入uodo 日志文件2. 更新数据后 会把数据写入redo缓冲池,这意味着这个缓冲池落地磁盘,跟事务有关系,可以通过`innodb_flush_log_at_trx_commit `配置。3. 当参数是1时,就是必须把redo log写入磁盘才能提交事务。0 的时候就是不会有redo日志、2 的时候是先写oscache 这两种都有丢失数据的风险4. buffer pool就是我们一直在操作的数据的缓冲区。5. redo log 文件里面也是一块一块追加在一起的
2021-01-21 11:38:53
175
原创 MySQL-连接查询学习
连接查询的基本语法INNER JOIN ## 内连接和外连接的根本区别就是在驱动表中的记录不符合ON子句中的连接条件时不会把该记录加入到最后的结果集LEFT JOIN ## 右边未匹配的null展示RIGHT JOIN ## 左边未匹配的null展示连接的原理需要知道的知识对于两表连接来说,驱动表只会被访问一遍,但被驱动表却要被访问到好多遍,来匹配记录。如果我们自己用代码来做连接查询,用不到索引走数去查询被驱动表,性能肯定完全没有mysql那么好在决定哪个表做驱动表的时候,应该是
2021-01-21 11:37:45
119
1
原创 MySQL-成本与统计数据学习
MySQL执行一个查询可以有不同的执行方案,它会选择其中成本最低,或者说代价最低的那种方案去真正的执行查询基于成本的优化步骤根据搜索条件,找出所有可能使用的索引计算全表扫描的代价计算使用不同索引执行查询的代价对比各种执行方案的代价,找出成本最低的那一个CREATE TABLE single_table ( id INT NOT NULL AUTO_INCREMENT, key1 VARCHAR(100), key2 INT, key3 VARCHAR(10.
2021-01-21 11:36:40
372
2
原创 MySQL-查询-SQL简化与子查询的物化
条件化简## 移除不必要的括号((a = 5 AND b = c) OR ((a > c) AND (c < 5))) 改 (a = 5 and b = c) OR (a > c AND c < 5)## 常量传递(constant_propagation)a = 5 AND b > a 改 a = 5 AND b > 5## 移除没用的条件(trivial_condition_removal)(a < 1 and b = b) OR (a = 6 O
2021-01-21 11:35:39
915
原创 MySQL-Buffer Pool 学习
一条sql执行基本流程在老版本的MySQL中sql通过连接进来时会有查询缓存这一块的逻辑。查询解析器解析sql 是否正确后,然后基本优化sql,生成执行计划,选择引擎执行。而InnoDB 在执行时 为了保证对数据的执行更快,省去磁盘IO开销 引入了Buffer PoolBuffer Pool当需要访问某个页的数据时,就会把完整的页的数据全部加载到内存中,也就是说即使我们只需要访问一个页的一条记录,那也需要先把整个页的数据加载到内存中,从某种意义上来说buffer pool 完全可以替代了查
2021-01-21 11:31:43
252
2
原创 Nginx学习笔记(对于开发来说够用、实用)包含(编译、热部署、反向代理、虚拟主机配置、缓存、负载均衡)
Nginx笔记、Nginx编译、Nginx虚拟主机、热部署、location、return、rewrite、Nginx反向代理、Nginx缓存、Nginx负载均衡
2020-08-17 16:03:31
352
原创 总结Redis问题
redis 穿透 雪崩 击穿redis cluster redis 哨兵 redis面试 redis持久化 RDB AOF redis单线程性能为什么这么好redis过期策略redis 线程模型一致性 hashhash slot redis寻址算法
2020-05-26 15:55:12
1233
原创 使用frp进行内外网访问
搭建frp服务器进行内外网访问,可用且推荐,可以达到不错的速度,且理论上可以开放任何想要的端口,可以实现的功能远不止远程桌面或者文件共享准备: ip(有域名可以配合ip映射访问如果要映射80端口需要配合nginx)frp地址服务端配置在 github 找到你电脑架构对应的版本下载wget https://github.com/fatedier/frp/releases/download/v0.31.0/frp_0.31.0_linux_amd64.tar.gz解压tar -zxvf frp_
2020-05-13 17:04:35
429
原创 数据结构学习-动态数组
学习数据结构 -动态数组 模仿 ArrayListpublic class ArrayList<E> { /** * 大小 */ private int size; /** * 原始数组 */ private Object[] elementData; /** * 空数组 */ private static final Object[] EMPTY_DATA = {}; .
2020-05-13 16:38:48
190
原创 完整安装kubernetes集群环境(不需要科学上网)
1.准备基础环境我们将使用kubeadm部署3个节点的 Kubernetes Cluster节点详细信息:节点主机名节点IP节点角色操作系统节点配置k8s-master192.168.217.131masterCentOS7.62C4Gk8s-node1192.168.217.132nodeCentOS7.62C4Gk8s-node21...
2020-02-19 21:46:27
1918
2
原创 并发编程学习(6)CountDownLatch、Semaphore、CyclicBarrier
CountDownLatchcountdownlatch 是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完毕再执行,countdownlatch 提供了两个方法,一个是 countDown,一个是 await。countdownlatch 初始化的时候需要传入一个整数,在这个整数倒数到 0 之前,调用了 await 方法的程序都必须要等待,然后通过 countDown 来...
2020-02-19 21:44:03
218
原创 并发编程学习(5)Condition
Condition在前面学习 synchronized 的时候,有wait/notify 的基本使用,结合 synchronized 可以实现对线程的通信。那么,既然 J.U.C 里面提供了锁的实现机制,那 J.U.C 里面应该也有提供线程通信的机制,Condition 是一个多线程协调通信的工具类,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒。测试代...
2020-02-19 21:41:16
315
原创 并发编程学习(4)Lock
初步认识JUCJava.util.concurrent 是在并发编程中比较常用的工具类,里面包含很多用来在并发场景中使用的组件。比如线程池、阻塞队列、计时器、同步器、并发集合等等。并发包的作者是大名鼎鼎的 Doug Lea。lock在 Lock 接口出现之前,Java 中的应用程序对于多线程的并发安全处理只能基于synchronized 关键字来解决。但是 synchronized 在有些场...
2020-02-19 21:38:56
393
原创 并发编程学习(3)线程安全性分析
初步认识 Volatile public /*volatile*/ static boolean stop=false; public static void main( String[] args ) throws InterruptedException { Thread t1=new Thread(()->{ int i=0; ...
2020-02-19 21:36:00
203
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人