随笔 - 15  文章 - 0  评论 - 3 
  2020年12月3日
摘要:写操作执行过程 如果这条sql是写操作(insert、update、delete),那么大致的过程如下,其中引擎层是属于 InnoDB 存储引擎的,因为InnoDB 是默认的存储引擎,也是主流的,所以这里只说明 InnoDB 的引擎层过程。由于写操作较查询操作更为复杂,所以先看一下写操作的执行图。方 阅读全文
posted @ 2020-12-03 20:55 萌新J 阅读(244) 评论(2) 推荐(4) 编辑
  2020年11月30日
摘要:本文主要总结 MySQL 事务几种隔离级别的实现和其中锁的使用情况。 在开始前先简单回顾事务几种隔离级别以及带来的问题。 四种隔离级别:读未提交、读已提交、可重复读、可串行化。 带来的问题:脏读、不可重复读、幻读。分别是由读未提交、读已提交、可重复读引起的。 脏读:一个事务读取到在另一个事务还未提交 阅读全文
posted @ 2020-11-30 20:32 萌新J 阅读(234) 评论(0) 推荐(1) 编辑
  2020年11月8日
摘要:什么是AQS? AQS是JUC内容的基石,它本质上是一个抽象类,定义了多线程下资源争夺与释放的规则和过程,许多实现类都是继承于AQS,使用AQS的骨架。 AQS的原理 AQS总体上来看是由一个FIFO(先进先出)队列和一个state属性配合组成的。FIFO用来存储线程结点的,state属性用来表示资 阅读全文
posted @ 2020-11-08 11:33 萌新J 阅读(101) 评论(0) 推荐(1) 编辑
  2020年10月9日
摘要:散列表 在了解hashmap之前,要先知道什么是散列表,因为hashmap就是在散列表结构基础上改造而成的。散列表,也叫哈希表,是根据关键码值(key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的 阅读全文
posted @ 2020-10-09 16:05 萌新J 阅读(710) 评论(0) 推荐(1) 编辑
  2020年12月3日
摘要:写操作执行过程 如果这条sql是写操作(insert、update、delete),那么大致的过程如下,其中引擎层是属于 InnoDB 存储引擎的,因为InnoDB 是默认的存储引擎,也是主流的,所以这里只说明 InnoDB 的引擎层过程。由于写操作较查询操作更为复杂,所以先看一下写操作的执行图。方 阅读全文
posted @ 2020-12-03 20:55 萌新J 阅读(244) 评论(2) 推荐(4) 编辑
  2020年12月1日
摘要:本文主要说明 InnoDB Buffer Pool 的内部执行原理,其生效的前提是使用到了索引,如果没有用到索引会进行全表扫描,如果数据量大会分批依次传入 Buffer Pool 进行查询。也就是磁盘上的数据都是通过缓冲池来筛选读取的。 结构 在 InnoDB 存储引擎层维护着一个缓冲池,通过其可以 阅读全文
posted @ 2020-12-01 22:47 萌新J 阅读(119) 评论(0) 推荐(0) 编辑
  2020年11月30日
摘要:本文主要总结 MySQL 事务几种隔离级别的实现和其中锁的使用情况。 在开始前先简单回顾事务几种隔离级别以及带来的问题。 四种隔离级别:读未提交、读已提交、可重复读、可串行化。 带来的问题:脏读、不可重复读、幻读。分别是由读未提交、读已提交、可重复读引起的。 脏读:一个事务读取到在另一个事务还未提交 阅读全文
posted @ 2020-11-30 20:32 萌新J 阅读(234) 评论(0) 推荐(1) 编辑
  2020年11月26日
摘要:定义 一句话总结,索引是一个排好序的用于快速查找的数据结构。这句话说明了索引的三个特点,第一个是有序的,已经将索引列数据排好序了;第二个是快速查找,这就意味着使用索引可以快速定位到符合条件的数据;第三个是一个数据结构。我们平时使用 SQL 语句查询数据时,比如执行 select * from stu 阅读全文
posted @ 2020-11-26 10:40 萌新J 阅读(282) 评论(1) 推荐(2) 编辑
  2020年11月22日
摘要:1、wait-notify 1.0 就存在,最初始的实现方式。 wait()、notify()、notifyAll() 是 Object 类中的方法,所以使用范围是最广的,所有对象都可以使用这个方式再搭配 synchronized 关键字实现等待-唤醒模型。 缺点:1、nofity() 只能将调用当 阅读全文
posted @ 2020-11-22 17:21 萌新J 阅读(17) 评论(0) 推荐(0) 编辑
摘要:如果我们想要当前线程暂停2s,常用的方法是下面这种 try { Thread.sleep(2*1000); }catch(Exception e) {e.printStackTrace();} 这种方式是以毫秒为单位进行计算的,在需要的时间比较长时就需要进行计算,像上面这种乘法,如果比较复杂的话sl 阅读全文
posted @ 2020-11-22 16:23 萌新J 阅读(18) 评论(0) 推荐(0) 编辑
摘要:引入 为什么使用线程池? 在连接数少的情况下,对于需要线程的地方我们只需要直接新建线程来处理就可以了,但是在并发量高的场景下,频繁的线程创建、销毁是非常消耗资源的,所以针对于这样的场景可以使用线程池,让一开始就创建好线程,在需要新连接进来需要线程时就从线程池中拿一条执行,完成后再将线程放回线程池,等 阅读全文
posted @ 2020-11-22 15:56 萌新J 阅读(118) 评论(0) 推荐(0) 编辑
  2020年11月21日
摘要:在并发编程中有各种各样的锁,有的锁对象一个就身兼多种锁身份,所以初学者常常对这些锁造成混淆,所以这里来总结一下这些锁的特点和实现。 乐观锁、悲观锁 悲观锁 悲观锁是最常见的锁,我们常说的加锁指的也就是悲观锁。顾名思义,每次修改都抱着一种 "悲观" 的态度,每次修改前都会认为有人会和他一样执行同一段代 阅读全文
posted @ 2020-11-21 15:16 萌新J 阅读(106) 评论(0) 推荐(0) 编辑
  2020年11月19日
摘要:List ArrayList 知识点 1、1.7之前默认初始容量是10,1.8开始是0,后面执行 add 方法后才会将内部用于存储数据的数组容量初始化为10,这样可以节省内存空间,防止创建后一直没有使用浪费空间。 2、扩容时机是添加的数据超过当前数组可以存储的容量时,会扩容为原来的1.5倍。 3、A 阅读全文
posted @ 2020-11-19 16:59 萌新J 阅读(18) 评论(0) 推荐(0) 编辑
  2020年11月10日
摘要:等待-唤醒模型中,之前一直使用if进行条件判断是否达到阀值来进行阻塞,比如下面的例子 1 public class CoTest01 { 2 public static void main(String[] args) { 3 SynContainer container = new SynCont 阅读全文
posted @ 2020-11-10 20:32 萌新J 阅读(28) 评论(0) 推荐(0) 编辑