- 博客(61)
- 收藏
- 关注
原创 一文彻底弄懂红黑树
N 的父节点,兄弟节点 S 和 S 的孩子节点均为黑色。这种情况下可以简单的把 S 染成红色,所有经过 S 的路径比之前少了一个黑色节点,这样经过 N 的路径和经过 S 的路径黑色节点数量一致了。N(now)表示当前节点,P(parent)表示N的父节点,U(uncle)表示N的叔叔节点,G(grandfather)表示N的祖父节点,也就是P和U的父节点。3)此时需要改变颜色,故将10的父节点15和父节点15的兄弟节点68由红色变为黑色,节点15和节点68的父节点由黑色变为红色,并以此递归向上调整。
2024-06-11 19:29:55
842
1
原创 Nginx学习笔记
Nginx 是一个很强大的高性能Web和反向代理服务;其特点是占有内存少,并发能力强;能够支持高达 50,000 个并发连接数的响应。
2022-11-06 14:38:38
903
原创 MySQL高级之MVCC机制详解(七)
一、前言在文章MySQL高级之锁机制详解(五)中,我们详解介绍了MySQL行级锁的概念及使用。但是锁的操作毕竟会影响性能,为了提升性能,可否采用不加锁的方式进行,下面举一个案例:表t包含两列id和col,其中id为主键idcol110315现在事务A更新id=1的数据update t1 set col=11 where id=1;事务A还未提交,事务B查询id=1的数据select * from t where id=1;按照之前行级锁的
2022-04-06 13:04:20
1229
原创 MySQL高级之事务详解(六)
一、事务初识1. 什么是事务事务就是一组独立不可分割的工作单元,事务中的操作要么全部执行,要么都不执行。事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作,一组不可再分割的操作集合(工作逻辑单元)。简单来说,事务就是并发控制的单位,是用户定义的一个操作序列。在关系型数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。MySQL中,MyISAM引擎没有实现事务,而InnoDB实现了事务,这也是MyISAM 逐渐被InnoDB 所替代的原因之一。2. 为什
2022-04-06 13:02:35
1197
原创 MySQL高级之锁机制详解(五)
一、概述1. 什么是锁锁是计算机协调多个进程或线程并发访问某一资源的机制在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。2. 为什么要使用锁数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。对于任何一种数据
2022-04-06 13:01:42
1004
原创 MySQL高级之查询优化分析(四)
一、前言1. SQL执行慢的原因从sql本身角度来说没有创建索引索引失效(一些原因导致没有使用到)关联查询太多的join从服务器角度来说服务器磁盘空间不足服务器调优配置参数设置不合理2. 如何优化接下来的三、四和五章将为大家详细介绍如何优化。二、MySQL性能分析工具在讲解优化前,先介绍MySQL几个性能分析工具。1. ExplainMySQL查看sql执行计划的关键字,使用explain关键字可以模拟优化器执行sql查询语句,从而得知MySQL 是如何处理sql
2022-04-06 13:00:51
442
原创 SpringBoot自动装配原理
一、@SpringBootApplication正常情况下的启动类都会加上@SpringBootApplication注解@SpringBootApplicationpublic class SpringbootSourceApplication { public static void main(String[] args) { SpringApplication.run(SpringbootSourceApplication.class, args); }}
2022-03-23 09:00:22
863
原创 SpringBoot下@Transactional原理
一、@Transactional的使用加在方法上:方法内的所有操作处于一个事务中加在类上该类的所有public修饰的方法都具有共享事务属性如果方法和类上都有事务注解,方法上的事务注解优先二、@Transactional原理Springboot目前最为流行,它的约定大于配置的特性深受大家喜欢,注解驱动开发已成为主流。面向元数据遍历已经成为越来越多开发者的偏好,因此原理从Springboot的EnableTransactionManagement注解说起1、@EnableTransact
2022-03-23 08:58:54
2532
1
原创 ClassPathXmlApplicationContext源码解析
源码分析ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");查看源码public ClassPathXmlApplicationContext(String configLocation) throws BeansException { this(new String[] {configLocation}, true, null);}public
2022-03-23 08:57:30
1218
1
原创 Spring getBean方法源码解析
User user = (User) beanFactory.getBean("user");注:User为一普通bean查看方法(AbstractBeanFactory#getBean)public Object getBean(String name) throws BeansException { return doGetBean(name, null, null, false);}继续查看方法(AbstractBeanFactory#doGetBean)protected &
2022-03-23 08:55:43
609
原创 ThreadLocal详解
一、什么是ThreadLocal我们先看一下API说明(1.8版本)/** * This class provides thread-local variables. These variables differ from * their normal counterparts in that each thread that accesses one (via its * {@code get} or {@code set} method) has its own, independently
2022-03-08 21:52:07
474
原创 LockSupport并发工具类详解
一、简介我们知道,AbstractQueuedSynchronizer(AQS)的核心包括同步队列(CLH)、CAS操作和LockSupport。其中AQS利用LockSupport来控制线程的状态,利用park和unpark实现线程的等待与唤醒,从而能够达到管理线程的目的。下面将为大家详细介绍LockSupport类。二、属性及构造方法1. 属性public class LockSupport { // Unsafe实例 private static final sun.misc.
2022-03-08 09:11:02
496
原创 聊一聊Java中的Unsafe类
一、Unsafe类简介如果看过JUC的源码,相信大家一定不会对Unsafe这个类陌生,整个JUC的底层核心就是这个Unsafe类。Unsafe类是位于sun.misc包下的一个类,它是jdk提供的一个直接访问操作系统资源的工具类(底层c++实现)。正如它的名字一样,这个类是不安全的,但是功能特别强大。那么它有什么样的强大功能呢?Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力。众所周知,相对于C和C++,Java语言使开发人员在开发时无需关注内存的管理,这些JVM全部自动处理了。但是如
2022-03-08 09:09:47
1029
原创 Java并发之Condition详解
一、简介1. 什么是Condition任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、notify()以及notifyAll()方法,这些方法与synchronized同步关键字配合,可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特性上还是有差别的。——摘自《Java并发编程的艺术》下面是Cond
2022-03-05 11:50:02
1244
原创 JDK源码解析之LinkedHashMap
一、简介LinkedHashMap 继承自 HashMap,除了拥有HashMap的特性外,还提供了保持遍历顺序和插入顺序一致的功能。LinkedHashMap维护了一条双向链表,从而保证了遍历与插入顺序的一致性。LinkedHashMap可以理解为LinkedList + HashMap的组合LinkedHashMap的绝大多数功能(查找、插入、删除等)直接来源于HashMap,因此本文主要研究双向链表的维护。如果对HashMap不了解,可以查看之前的文章:JDK源码解析之HashMap以
2022-03-05 09:48:00
516
原创 JDK源码解析之LinkedList
一、概述LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的,是线程不安全的,允许元素为null的双向链表。LinkedList本质就是双向链表,每个节点都有指向前驱和指向后继的指针,从而构成链表。相对于之前讲的ArrayList,LinkedList 使用较少,它的源码也相对简单许多。二、类图可以看到LinkedList实现了四个接口java.util.List:提供数组的添加、删除、修改、迭代遍历等操作java.util.Deque
2022-03-05 09:47:29
300
原创 JDK源码解析之HashSet
一、简介HashSet是基于HashMap实现的Java集合,它可以保证存储的元素不重复HashSet的底层就是通过HashMap的key来保存元素,从而保证存储的元素不重复。如果对HashMap熟悉的话,HashSet基本也就掌握了,它的底层源码相对简单多了。如果对HashMap不熟悉,可以参考我之前的文章:JDK源码解析之HashMap基于JDK1.8版本二、类图实现了三个接口实现 java.util.Set接口实现 java.io.Serializable 接口。实现 j
2022-03-05 09:46:56
274
原创 JDK源码解析之HashMap
一、简介是一种散列表,用于存储 key-value 键值对的数据结构HashMap最早出现在 JDK 1.2中,底层基于散列算法实现。HashMap允许 null 键和 null 值,在计算键的哈希值时,null 键哈希值为 0。HashMap并不保证键值对的顺序,这意味着在进行某些操作后,键值对的顺序可能会发生变化。下面的讲解以1.8版本为准,适当的时候会与1.8之前的版本作比较二、底层原理1. JDK1.8版本之前底层采用数组+链表的数据结构来实现,如下图所示添加元素时,获取
2022-03-05 09:46:16
384
原创 JDK源码解析之ArrayList
一、简介ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小等好处它的底层就是数组队列,相对于Java中的数组来说,它的容量可以动态增长,因此被称为动态数组。正因为自动扩容机制,ArrayList已经成为平时最常用的集合类(以下的讲解基于jdk1.8版本)。二、类图ArrayList的类图如下所示可以看到ArrayList实现了四个接口java.util.List:提
2022-03-05 09:45:25
303
原创 Redis学习笔记(三)——redis常用命令汇总
一、常用管理命令1. 启动Redisredis-server [--port 6379]如果参数过多,可以通过配置文件来启动Redisredis-server [xx/xx/redis.conf]2. 连接Redis./redis-cli [-h 127.0.0.1 -p 6379 -a 你的密码]3. 停止Redisredis-cli shutdownkill redis-pid以上两句效果一样。4. 测试Redis连通性127.0.0.1:6379> PINGP
2022-03-04 09:06:26
274
原创 Redis学习笔记(二)——Redis入门
一、Redis 的介绍1. 什么是Redis全称:Remote Dictionary Server (远程字典服务)redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同
2022-03-04 09:05:48
631
原创 Redis学习笔记(一)——NoSQL概述
一、相关概念RDBMS(Relational Database Management System):指的就是关系数据库管理系统是指包括相互联系的逻辑组织和存取这些数据的一套程序 (数据库管理系统软件)。关系数据库管理系统就是管理关系数据库,并将数据逻辑组织的系统NoSQL(Not Only SQL):泛指非关系型的数据库。大数据时代的3VVelume(海量)Variety(多样)Velocity(实时)互联网需求的3高高并发高可扩高性能
2022-03-04 09:05:02
559
原创 Java并发工具之Semaphore
一、简介摘自《Java并发编程的艺术》一书Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。Semaphore一般用于流量的控制,特别是公共资源有限的应用场景。例如数据库的连接,假设数据库的连接数上线为10个,多个线程并发操作数据库可以使用Semaphore来控制并发操作数据库的线程个数最多为10个。二、类总览通过上面的类图可以看到,Semaphore与ReentrantLock的内部类的结构相同,类内部总共存在Sync、Nonf
2022-02-28 21:40:33
14946
1
原创 Java并发工具之CyclicBarrier
一、简介摘自《Java并发编程的艺术》一书中CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。CyclicBarrier,一个同步辅助类,在API中是这么介绍的: 它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,
2022-02-28 21:40:03
2166
原创 Java并发工具之CountDownLatch
一、简介CountDownLatch允许一个或多个线程等待其他线程完成操作。CountDownLatch,可以理解为倒计时工具,类似“三二一,芝麻开门”。该工具用于一组操作执行完成才能执行后续操作的场景。例如项目小组的晨会,需要等到所有人齐了才能正式开会。CountDownLatch是通过一个计数器来实现的,当我们在new一个CountDownLatch对象的时候初始化计数器的值,该值也代表了需要等待任务的完成数。每当一个线程完成自己的任务后,计数器的值就会减1。当计数器的值变为0时,就表示所有的
2022-02-28 21:39:32
614
原创 ReentrantReadWriteLock详解
一、简介1. 什么是读写锁前面我们介绍了ReentrantLock类,知道它的功能类似synchronized关键字,属于排它锁,同一时刻仅有一个线程可以进行访问。但是在大部分的场景下,读操作往往远大于写操作,其中读操作之前不存在数竞争关系,而写操作与其余的读写操作互斥。因此JDK为我们提供了读写锁——ReentrantReadWriteLock。读写锁维护着一对锁,一个读锁和一个写锁。通过分离读锁和写锁,使得并发性比一般的排他锁有了较大的提升:在同一时间可以允许多个读线程同时访问,但是在写线程访问时
2022-02-28 21:38:50
873
原创 ReentrantLock详解
一、简介1. Lock接口在讲ReentrantLock前,我们先熟悉一下Lock接口。在Lock接口出现之前,Java程序主要是靠synchronized关键字实现锁功能的,而JDK1.5之后,并发包中增加了Lock接口,它提供了与synchronized一样的锁功能。虽然它失去了像synchronize关键字隐式加锁解锁的便捷性,但是却拥有了锁获取和释放的可操作性,可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。Lock接口的定义如下public interfa
2022-02-28 21:38:19
1202
原创 深入理解AQS实现原理
一、AQS简介1. 什么是AQSAQS全称为AbstractQueuedSynchronizer,翻译过来就是抽象队列同步器。AQS是一个用来构建锁和其他同步组件的基础框架,使用AQS可以简单且高效地构造出应用广泛的同步器,例如我们后续会讲到的ReentrantLock、Semaphore、ReentrantReadWriteLock和FutureTask等等。2. AQS的核心思想AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态
2022-02-28 21:37:43
3994
2
原创 深入理解volatile底层原理
一、前言之前我们学习过synchronized,知道它是一个重量级的锁,虽然jdk1.6对其做了很大的优化,但是成本还是较高。因此Java另一个关键字闪亮登场——volatile。volatile又被称为轻量级的synchronized,它在多处理器中保证了共享变量的可见性。volatile变量修饰符如果使用恰当的话,它比synchronized的使用和执行成本会更低。下面我们将深入剖析volatile的实现原理。二、什么是volatileJava语言规范第3版中对volatile的定义如下Jav
2022-02-28 21:37:12
4279
4
原创 深入理解final底层原理
一、简介final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。二、使用场景在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。1. 修饰类当用final修饰一个类时,表明这个类不能被继承。最常见是就是String类,任何类都无法继承它。public final class String implemen
2022-02-28 21:35:42
2132
原创 MySQL高级之索引详解(三)
一、索引的定义MySQL官方定义:索引是存储引擎用于快速找到记录的一种数据结构索引的本质:索引是数据结构可以理解为排好序的快速查找数据结构。数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以文件形式存储在硬盘上二、索引的优劣势优势1)索引大大减少了服务器需要扫描的数据量2)索引可以帮助服务器避免排序和临时表
2022-02-11 18:55:52
582
原创 MySQL高级之JOIN详解(二)
一、SQL执行顺序1. SQL手写结构SELECT DISTINCT <select_list>FROM <left_talbe> <join_type> JOIN <right_table> ON <join_condition>WHERE <where_condition>GROUP BY <group_by_list>HAVING <having_condition>ORD
2022-02-11 18:54:54
535
原创 MySQL高级之MySQL简介(一)
一、MySQL简介MySQL是一个开放源代码的关系型数据库管理系统,由瑞典MySQL AB公司开发,后来被Sun公司收购,Sun公司后来又被Oracle公司收购,目前属于Oracle旗下产品。因为其速度、可靠性和适应性而备受众多互联网企业青睐。二、MySQL下载安装1. 下载地址下载地址:以5.5.48版本为例2. 安装步骤(RPM安装)1)上传安装包到指定的目录下(我的放在/opt目录下)[root@vm01 opt]# cd /opt/[root@vm01 opt]# ll总用量
2022-02-11 18:53:52
485
原创 Spring如何循环依赖
一、什么是循环依赖循环依赖指的是2个或2个以上的bean互相持有对方,从而形成闭环的依赖场景。例如A依赖B,B依赖C,而C又依赖A,这种情况就叫做循环依赖。二、循环依赖的场景1、构造器的循环依赖2、setter循环循环依赖三、Spring Bean的创建过程源码见org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)@Overridepublic Object getBea
2022-01-16 12:51:00
1157
原创 设计模式详解(二十二)——备忘录模式
一、场景问题某手游公司经营一款中国象棋游戏,在用户的反馈中发现一些用户由于屏幕操作失误经常出现下错棋的情况,但是系统并未提供撤销的功能,现需要设计一套撤销的功能可以回退棋子状态可以取消回退请设计一条切实可用的程序。二、传统解决方案一种解决思路就是每个棋子对象存储自己走过的快照信息,根据不同的时间恢复到指定的状态。这种方式简单可行,但是过多的信息混合到实体对象中,导致对象臃肿,违背单一职责原则。针对这种情况,我们可以进行指责分离,抽出一个单独的备忘录来优化。这就引出了本文的主题——备忘录模式。
2020-11-12 18:52:37
364
原创 设计模式详解(二十一)——访问者模式
一、场景问题某公司人事部门和财务部门都会处理员工的基础数据。财务部门:会访问员工的薪水情况人事部门:会访问员工的出勤情况员工分为正式员工和临时工二、传统解决方案定义抽象部门接口,财务部门和人事部门为其实现子类,分别在各自的类中处理逻辑,这种方式也能很方便解决问题,至于访问者模式,会导致代码抽象,晦涩难懂,不建议使用访问者模式。下文仅仅作为模式的案例展示。三、模式剖析1、模式定义访问者模式(Visitor Pattern):将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使
2020-11-10 19:22:12
281
原创 设计模式详解(二十)——迭代器模式
一、场景问题在激烈的市场竞争中,为了提高自己的硬实力,A公司和B公司决定合并。现在目前二者的员工信息都存放在不同的数据库中,且存储的方式不同,请设计出统一的读取所有员工(A、B公司之和)信息的接口。为了简化问题,假定A公司使用List集合存储员工信息B公司使用数组存储员工信息二、传统解决方案最直观的做法是分别查询出来二者的员工数据,采用其中一种格式转化为另一种格式的方式来遍历读取。这种方式处理起来最简单,也最容易理解,但是没有考虑以后的扩展性。如果新增一种采用另外的数据结构存储用户信息,需要
2020-11-10 18:55:11
320
原创 设计模式详解(十九)——中介者模式
一、场景问题设计一套买房与卖房的交互程序。二、传统解决方案最直观的做法是定义卖方和买方的实体,二者直接进行信息交互。但是随着买方和卖方的人数新增,实体之间的交互会变得错综复杂,直接交互的设计方案会导致系统的通信链路交错复杂,且实体之间耦合过多,维护困难。因此我们可以采用中间层(中介)的方式来简化交互流程。即每个客户都只与中介交互,由中介来负责传递消息,使得各个实体间解耦,较少交互上的不便性。(即现在的房地产中介公司,当然缺点就是增加了中介费)。三、模式剖析1、模式定义中介者模式(Mediato
2020-11-09 19:53:48
376
2
原创 设计模式详解(十八)——观察者模式
一、场景问题设计一套报纸发布/订阅的程序设计报亭:发布内容,并分发到各个订阅者读者:订阅报纸,也可取消订阅二、传统解决方案一种解决方式是报刊只负责生产报纸,发布内容。由各个订阅者自己去报亭拿自己的报纸。这种方式会导致各个订阅者需要不间断地轮询报亭取报纸,造成资源的浪费。所以这类问题一般会采用观察者模式来实现。三、模式剖析1、模式定义观察者模式(State Pattern):指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有
2020-11-04 18:50:58
358
原创 设计模式详解(十七)——状态模式
一、场景问题某银行需要设计一套信用卡账户管理系统,其中账户大约分为三种状态正常状态账户余额大于等于0,即不存在欠款情况。此时用户可以存款,也可以取款。透支状态账户余额小于0,且欠款金额小于5000。用户可以存款,也可以取款。受限状态账户的欠款金额大于等于5000,用户无法继续取款,仅仅能够存款。请设计一套可用的信用卡账户存钱取款程序。二、传统解决方案1、解决思路每次存款取款校验状态判断是否可操作代码展示账户类public class Account {
2020-11-03 19:07:56
378
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人