- 博客(50)
- 资源 (2)
- 收藏
- 关注
原创 concurrent包的实现(并发编程的艺术)
分析concurrent包的源代码实现,会发现一个通用化的实现模式:首先,声明共享变量为volatile。然后,使用CAS的原子条件更新来实现线程之间的同步。同时,配合以volatile的读/写和CAS所具有的volatile读和写的内存语义来实现线程之间的通信。AQS,非阻塞数据结构和原子变量类(java.util.concurrent.atomic包中的类),这些concurrent 包中的基础类都是使用这种模式来实现的而concurrent包中的高层类又是依赖于这些基础类来实现的.
2020-11-19 15:59:38
237
原创 AQS
模板方法模式:模板:package com.atguigu.springcloud.template;/** * 抽象模板类Cook * 步骤一:cookOne * 步骤二:cookTwo * 步骤三:cookThree * 提供一个标准模板,执行顺序分别为一,二,三 */public abstract class Cook { //抽象类的抽象方法没有方法体,类似于接口方法 public abstract void cookOne(); public
2020-11-19 15:36:17
483
原创 volatile的内存语义
一:保证内存的可见性二:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性三:禁止指令的重排序解析:一:对于使用volatile关键字的共享变量,会强制将修改后的值立即写入主内存,并会使得其他处理器里面的缓存行失效(嗅探机制,缓存一致性协议),所以其他线程会重新从主内存中获取对应的新值,所以可见性是通过主内存来实现的。二:可以理解volatile具有一定的原子性,但不是全部:private volatile boolean .
2020-10-29 16:49:26
223
原创 Java内存模型(JMM)基础
本地内存是一个便于理解的抽象概念,物理上涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化重排序:三种重排序会导致内存可见性问题:1属于编译器重排序,2和3属于处理器重排序。对于编译器,JMM的编译器重排序规则会禁止特定类型的编译器重排序(不是所有的编译器重排序都要禁止)。对于处理器重排序,JMM的处理器重排序规则会要 求Java编译器在生成指令序列时,插入特定类型的内存屏障(Memory Barriers,Intel称之为 Memory Fence)指令,通过内存屏障指令来..
2020-10-28 15:38:40
176
原创 Java多线程保证原子操作原理
缓存行:缓存的最小单元处理器保证原子操作的俩种方式:缓存锁和总线锁处理器保证从系统内存中读取或者写 入一个字节是原子的,意思是当一个处理器读取一个字节时,其他处理器不能访问这个字节 的内存地址。但是复杂的内存操作处理器是不能自动保证其原子性的,比如跨总线宽度、 跨多个缓存行和跨页表的访问总线锁:处理器提供LOCK信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该 处理器可以独占共享内存缓存锁(不是所有的处理器都支持):内存区域如果被缓存在处理器的缓存.
2020-10-27 14:31:23
405
原创 volatile底层实现(Java并发编程的艺术)
内存屏障:是CPU的一组指令,实现对内存操作的顺序限制有多种类型,读屏障,写屏障。。volatile多线程数据之间的可见性的底层实现(强制刷新了缓存)缓冲行:
2020-10-21 15:15:50
93
原创 Stream用法
//stream:对数据源进行一系列流水线式的操作,产生新数据,所以数据源不会改变//创建stream4种方式//1.通过Collection系列集合提供的stream()或parallelStream()//stream()是单线程的,而parallelStream()是多线程并行处理List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);Stream<Integer> stream1 = list.stream();st.
2020-10-20 16:54:19
727
原创 Java虚拟机--- 强,软,弱,虚引用(读深入理解Java虚拟机)
强引用(Strongly Re-ference):类似于new Object(),不回收强引用对象软引用(Soft Reference):还有用,但非必须的对象。只被软引用关联着的对象。内存溢出异常前,会把这些对象进行第二次回收,如果这次回收还没有足够的内存, 才会抛出内存溢出异常。引用队列SoftReference类来实现弱引用(Weak Reference):当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉被弱引用关联的对象。引用队列WeakReference类来实现弱引用虚引用(Ph
2020-09-22 14:50:33
160
原创 Java虚拟机--- 判断对象是否已死的算法(读深入理解Java虚拟机)
很漂亮的一句话:Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进来,墙里面的人想出去。引用技数算法:Java虚拟机不是此方法对象中添加一个引用计数器,每当有地方引用它时,计数器加一,引用失效时,减一。为0时则为不可能再使用。很难解决循环引用问题:A引用B,B引用A可达性分析算法(Reachability Analysis):是通过 一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的..
2020-09-18 15:35:51
112
原创 Java虚拟机---对象创建过程(读深入理解Java虚拟机)
符号引用:.class文件里面的符号,告知jvm对应的类需要哪些调用方法,继承哪些类等信息直接引用:类似于指针,直接指向对应类的调用方法,继承类等信息符号引用转换为直接引用:通过符号引用 ,再加上符号引用的地址,转换成直接引用对象的创建:(1)java虚拟机遇到字节码new指令后,先检查此指令的参数是否能在常量池中定位到类的符号引用,并检查符号引用对应的类是已经被加载,解析和初始化,没有的话先加载这个。(2)类加载完成后,为新生对象分配内存(大小在加载完成后就确定了)(3)分配.
2020-09-16 17:42:57
132
原创 Java虚拟机---内存区域(读深入理解Java虚拟机)
程序计数器:当前线程所执行的字节码的行号指示器(标记 .class 字节码文件执行到哪行) Java多线程是靠线程的来回切换来实现(针对单个内核),切换后能回到正确位置,所以需要计数器 当前线程执行的是Java方法,则计数器记录的是对应的虚拟机字节码指令地址,若执行本地(Native)方法,null 唯一一个没有OutOfMemoryError的情况(根据上一条可看出...
2020-09-15 15:27:39
130
原创 InnoDB 事务(读MySQL技术内幕-InnoDB存储引擎)
ACID:原子性(Atomicity):整个数据库事务是不可分割的工作单位,事务中所有操作都成功,整个事务才算成功一致性(Consistency):从一种一致状态到下一种一致状态隔离性(Isolation):事务提交前对其他事务都不可见持久性(Durability):事务只要提交,就是永久性的事务的分类(类似于事务的传播属性):扁平事务(Flat Transactions)带有保存点的扁平事务(Flat Transactionswith Savepoints)链事务(C.
2020-09-08 23:49:38
152
原创 InnoDB 锁问题(读MySQL技术内幕-InnoDB存储引擎)
脏读: 一个事务读取到另一个事务未提交的数据(READ-UNCOMMITTED下会发生)不可重复读和幻读(READ-COMMITTED下会发生): 不可重复读:同一个事务俩次读取同一数据的内容不同(因为另一个事务删除或修改了数据) 幻读:同一个事务俩次读取的数据记录数目不同(因为另一个事务添加了新数据) 默认隔离级别(REPEATETABLE-READ)可以解决不可重复读,不一定能解决幻读: https://blog.csdn...
2020-09-08 01:43:04
152
原创 InnoDB 行锁的三种算法及Phantom Problem(读MySQL技术内幕-InnoDB存储引擎)
行锁三种算法: Record Lock:单个行记录上的锁 Gap Lock:间隙锁,锁定一个范围,但不会针对里面的每条记录上锁 Next-Key Lock:Gap Lock + Record Lock 锁定一个范围,且对记录本身也上锁 Record Lock:锁定的是索引,没有索引的话,锁定的是隐式的主键。 Next-Key Lock:此算法的锁定技术称为:Next-Key Locking 对于行...
2020-09-07 16:42:14
214
原创 InnoDB 锁及锁的类型(读MySQL技术内幕-InnoDB存储引擎)
锁的类型:共享锁(S Lock):允许事务读一行数据排他锁(X Lock):允许事务删除或更新一行数据意向共享锁(IS Lock):事务想要获取一张表中某几行的共享锁意向排他锁(IX Lock):事务想要获取一张表中某几行的排他锁事务T1已经获取了R记录的共享锁,事务T2任然能获取R记录的共享锁,即为兼容,反之不兼容从表格中看出:排他锁均不兼容,意向排他锁和共享锁不兼容,其他均兼容mysql中information_schema和performance_schema...
2020-09-03 15:38:04
147
原创 Hash表,HashCode,Hash函数等。。。
直接寻址表:直接寻址是汇编里面的概念:即直接给出指定数据在内存中的地址上图中的U指的是定义了一个关键字的全域(即所有的关键字都在里面) k为实际的关键字(实际使用到的)T为一个数组(T即为一个直接寻址表),其中每个位置都对应U里面的一个关键字(和直接寻址的概念相同)问题: U很大时,保存对应的T不合实际 实际使用的k相对于U很小时,则分配给T的空间大部分都浪费Hash表:由一个直接寻址表和hash函数组成常用的Hash函数: 除法散...
2020-09-01 16:26:29
270
原创 InnoDB 覆盖索引(读MySQL技术内幕-InnoDB存储引擎)
从辅助索引中就可以得到查询的记录,而不需要查询聚集索引中的记录辅助索引不包含整行的信息,所以其大小远远小于聚集索引,因此可以减少大量的IO操作(不一定是单表查询)。辅助索引其叶子节点存放信息:primary key1 , primary key2 , ..key1 , key2 , ...下列语句都仅仅使用一次辅助索引即可完成查询:辅助索引在统计上的优点: select count(*) from table上面的sql innoDB不会用到聚集索引来统计,因为...
2020-09-01 10:34:31
161
原创 InnoDB 联合索引(读MySQL技术内幕-InnoDB存储引擎)
联合索引也是一颗B+树,只是键值的数量不是1现创建(a,b)联合索引,则其索引树结构:通过叶子节点读出所有数据,即为:(1,1)(1,2)(2,1)(2,4)(3,1)(3,2)则a的值是有顺序的:1,1,2,2,3,3b的值是无序的:1,2,1,4,1,2但b相对于a是有序的,即a 固定的时候,b是有序的(也解释了索引的左匹配原则): 当a 为1时,b的顺序为:1,2 当a为2时,b的顺序为:1,4 。。。。。所以:select * from table ...
2020-09-01 09:40:01
822
原创 InnoDB中Cardinality值(读MySQL技术内幕-InnoDB存储引擎)
Cardinality值: 统计表中字段的高选择性: 类似于姓名字段,表中都不相同的,属于高选择性,适用于添加索引 类似于性别字段,只有男,女的,属于低选择性,则不适用于添加索引 show index from table;InnoDB中更新Cardinality值的策略: 表中1/16发生过变化 表中某一行记录频繁更新,表中却没有记录的添加时,更新次数>2 000 000 000次Cardinality值的统计:采样的...
2020-08-31 15:13:41
137
原创 mysql和redis一致性
https://www.cnblogs.com/liuqingzheng/p/11080680.html#_labelTop
2020-08-28 15:02:23
90
原创 Explain字段解析(Mysql)
explain + sql语句 了解次条sql语句的执行计划字段如下:id:select查询的序列号:id值越大,优先级越高,id值相同时,则执行顺序自上而下并不是有where子查询时id就会增加,具体何时会导致id增加暂时不清楚(下图)select_type:查询的类型simple :简单子查询(很多博客说不使用union和子查询)---应该指的是不包括in关键字吧。。 primary:最外层子查询 subQuery:第一层子查询...
2020-08-13 11:11:22
378
1
原创 索引的操作解析(覆盖,回表,下推)(需补充)
概念:覆盖索引:extra 值:using index 语句用到的所有列要被所使用的索引覆盖,不需要从数据表中读取数据(包括select,join和where子句使用到的列)测试联合索引:先添加联合索引:(暂时还不清楚非聚集索引,后面再补充)回表查询:索引下推:...
2020-08-10 11:13:25
390
原创 InnoDB数据结构和算法(读MySQL技术内幕-InnoDB存储引擎)
InnoDB支持的常用的索引:B+树索引,全文索引,哈希索引B+树是从平衡二叉树演化而来,却不是二叉树。https://www.cnblogs.com/yichengming/p/11176741.htmlB+树索引找到的并不是一个给定键值的具体行,而是被查找数据所在的页,将页读入到内存,再从内存中查找需要的数据二分查找法(折半查找法):每次取中心点做比较上图中:顺序查找平均次数:(1+2+3+4+5+6+7+8+9+10)/10 = 5.5次 ...
2020-07-30 18:24:07
146
原创 对象属性的校验,对象转换方法等
1.校验对象所有属性不能为null2.校验对象集合里面的对象所有属性不能为null3.校验对象指定的属性不能为null(keList为指定属性名称的集合)4.校验对象指定的属性可以为null,其他属性都不能为null(keyList为可以为null的属性集合)5.自定义对象转map(对象有一对多的关联关系):...
2020-07-28 10:14:14
354
原创 SpringCloud动态获取yml文件里面的自定义配置
不同的环境,bootstrap.yml加载不同的application文件:1.在application-dev.yml和application-prod.yml都写上配置2.定义类去获取(此种写法不需要指定特定的application文件,只需指定application里面的key值,bootstrap.yml加载哪个文件,就从哪个文件里面获取值)(下面的写法需要加载指定文件)...
2020-07-28 09:34:16
2148
原创 InnoDB启动和关闭(读MySQL技术内幕-InnoDB存储引擎)
mysql突然宕机对Innodb的影响:innodb_fast_shutdown:默认值为1 0表示mysql关闭时,Innodb需要完成所有的full purge和merge insert buffer,所有脏页刷回磁盘 1表示不需要所有的full purge和merge insert buffer,但需要刷脏页 2表示都不需要,而是将日志都写入到日志文件innodb_force_recovery影响InnoDB的恢复情况:默认为0 0表示进行所有的恢复操作,...
2020-07-18 17:38:07
154
原创 InnoDB特性(读MySQL技术内幕-InnoDB存储引擎)
插入缓冲俩次写自适应哈希索引异步IO刷新邻接页插入缓冲Insert Buffer:物理页的一部分对于非聚集索引的插入或者更新操作,不是每一次直接插入到索引数据页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入,若不在,先放在一个Insert Buffer对象中,看似数据库已经将这个非聚集索引插入到叶子节点中,实则没有,只是存放在另一个位置,再以一定的频率和情况进行Insert Buffer和辅助索引数据页的子节点的merge操作,将多个插入合并到一个操作中(在一.
2020-07-18 17:23:28
162
原创 InnoDB(Master Thread工作方式)(读MySQL技术内幕-InnoDB存储引擎)
内部由多个循环组成:主循环(loop),后天循环(backgroup loop),刷新循环(flush loop),暂停循环(suspend loop)Master Thread 会根据数据库运行状态在各个循环中进行切换Loop主循环(大部分操作):每秒的操作和每0秒的操作每秒的操作:1.日志缓冲刷新到磁盘,即使事务没有提交(总是)----->即使再大的事务,提交(commit)时间也很短的原因2。合并插入缓冲(可能)---->Innodb会判断前一秒的IO次数是否小于5次,
2020-07-18 14:10:42
106
原创 InnoDB(CheckPoint技术)(读MySQL技术内幕-InnoDB存储引擎)
Write Ahead Log策略(事务数据库系统):当事务条件时,先写重做日志,再修改页,(用日志恢复数据)Checkpoint(检查点)技术解决的问题:缩短数据库恢复时间:数据库宕机时,不需要重做所有的日志,因为checkpoint之前的页已经刷到磁盘了缓冲池不够用时,将脏页刷新到磁盘(给缓冲池腾空间):此时根据LRU算法会溢出最近最少使用的页(脏页),此时需强制执行Checkpoint,将脏页刷回磁盘重做日志不可用时,刷新脏页(重做日志不可用,即不能保证数据的恢复了,就相当于每次操作都
2020-07-17 08:41:21
185
原创 InnoDB体系架构(后台线程和内存池)(读MySQL技术内幕-InnoDB存储引擎)
1.InnoDB有多个后台线程(mysql引擎自己的)和内存块(内存块组成了一个大的内存池)内存池:缓存磁盘的数据后台线程:保证内存中缓存的是最新数据,并将数据刷新到磁盘中、后台线程:Master Thread (将数据缓冲池中的数据异步刷新到磁盘,包括脏页的刷新,合并插入缓冲,UNDO页的回收)脏页:内存数据页和磁盘数据页不一致时,称这个内存页为脏页,一致的内存页就是干净页合并插入缓冲:https://blog.youkuaiyun.com/qq_39101581/article/de..
2020-07-16 19:54:21
143
原创 WebService客户端和服务端(CXF)
客户端调用服务端的方式1.用流的方式调用2.通过工具生成客户端3.动态调用(对namespace有要求)
2020-07-14 18:47:12
389
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人