自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

dx1313113的博客

记录学习

  • 博客(140)
  • 收藏
  • 关注

原创 【面试题】介绍一下类加载过程,什么是双亲委派模型

()方法是在编译之后自动生成的。对于初始化阶段,虚拟机严格规范了有且仅有 6 种情况,必须对类进行初始化(只有主动去使用类才会初始化类)

2023-11-26 20:41:49 508

原创 Spring IOC 和 AOP

IoC (Inversion of Control 控制反转)是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由给 Spring 框架来管理。AOP(Aspect Oriented Programming)即面向切面编程。AOP 的目的是将横切关注点(例如日志管理、事务管理、权限控制、接口控制)从核心业务逻辑中分离出来,通过动态代理,字节码操作等技术,实现代码的复用和解耦,提高代码的可维护性和可扩展性。OOP(面向对象编程)

2023-11-24 21:34:11 461

原创 String 、StringBuffer 和 StringBuilder 的区别?

使用 String 声明一个字符串的时候,该字符串会存放在堆中的字符串常量池中。因为在java中所有的String 都是以常量表示,且由 final 修饰,因此在线程池中它的。虽然执行效率高,但是不安全所以不建议在多线程环境下对同一个 StringBuilder 对象进行操作。我们在创建String的时候,它在常量池中对这些信息进行处理,如果程序中出现了大量字符串拼接、划分等操作效率将非常低。比StringBuffer 效率低的原因:考虑到了多线程的情况,在进行字符串操作的时候 使用。

2023-11-23 20:10:05 270

原创 什么是缓存雪崩、击穿、穿透?

数据一般是存储于数据库中,数据库中的数据都是存在磁盘上的,磁盘读写的速度相较于内存或者CPU中的寄存器来说是非常慢的了。如果用户的请求都直接访问数据库的话,请求数量一上来,数据库很容易就崩溃了,所以为了避免用户直接访问数据库,会用 Redis 作为缓存层。因为Redis 是内存数据库,我们可以直接将数据库的数据缓存在 Redis 中,相当于数据缓存在内存,内存的读写速度比硬盘快很多,这样大大提升了系统的性能。引入了缓存层,就会有缓存异常的三个问题,分别是缓存雪崩、缓存击穿、缓存穿透。通常为了保证缓存中的数据

2023-11-18 22:16:47 355

原创 @Autowired 和 @Resource 的区别

比如:UserService接口有两个实现类:UserServiceImpl1 和 UserServiceImpl2 , 而且它们都已经被 Spring 容器所管理。@Resource 有两个比较重要且日常开发常用的属性:name (名称),type(类型)。会同时找到多个满足条件的选择,默认情况下它自己不知道选择哪一个。(根据类型进行匹配),也就是说会优先根据接口类型去匹配并注入。(根据名称进行匹配),这个名称通常就是类名(首字母小写)。内置的注解,默认的注入方式是。提供的注解,默认注入方式为。

2023-10-30 14:40:46 79

原创 MySQL 三大日志(bin log、redo log、undo log)

而 bin log 属于逻辑日志,记录的内容是语句的原始逻辑,比如:“给id 为 2 的这一行的 a 字段 加 1”,属于 Server 层。数据页的大小是 16KB ,刷盘比较耗时,可能就修改了数据页中的 几 Byte 数据,为了这些数据而重新刷盘整个页,有所不值。硬盘上存储的 redo log 日志文件不止一个,而是以一个日志文件组的形式出现,每个 redo 日志文件大小是一样的。中数据时以页为单位,查询一条记录,会从硬盘中把该页的数据都加载出来,加载出来的页叫做数据页,会放入。

2023-10-20 20:52:07 530 1

原创 为什么MySQL使用B+树索引,而不使用其他作为索引呢?

索引是一种用于快速查询和检索数据的数据结构,其本质可以看成一种排序号的数据结构。索引的作用相当于书的目录。打个比方:在查字典的时候,如果没有目录,那我们就只能一页一页地去查,速度很慢。如果有目录,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。索引底层数据结构存在很多种类型,常见的索引结构有:B树、B+树、Hash、红黑树。在 MySQL 中,无论是 Innodb 还是 MyIsam ,都使用了B+树作为索引结构。二分查找树。

2023-10-20 19:18:13 242

原创 Java IO流

IO 即 Input / Output ,输入输出流。IO流在Java中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。Java IO 流的 40 多个类都是从如下 4 个 抽象类基类中派生出来的。

2023-10-14 12:25:33 173

原创 Java synchronized 关键字

synchronized 关键字加到 static 静态方法和 synchronized(class) 代码快上都是给 class 类加锁synchronized 关键字加到实例方法上是给对象实例加锁尽量不要使用 synchronized(String a) ,因为 JVM中,字符串常量池具有缓冲功能、构造方法不能使用 synchronized 关键字修饰。构造方法本身就属于线程安全的,不存在同步的构造方法一说。

2023-10-13 13:45:40 91

原创 Java 中 Volatile 关键字

只要在某个线程中无法检测到重排序的情况(即使在其他线程中可以明显地看到该线程中的重排序),那么就无法确保线程中的操作将按照程序中指定的顺序来执行。两个关键字来保证线程之间操作的有序性,volatile 是因为其本身包含 "禁止指令重排序" 的语义,synchronized 是由"一个变量在同一时刻只允许一条线程对其进行 lock 操作" 这条规则获得的,此规则决定了持有同一个对象锁的两个同步块只能串行执行。在缺乏足够同步的多线程程序中,要想对内存操作的执行顺序进行判断,无法得到正确的结论。

2023-10-13 13:13:39 167

原创 HashMap为什么线程不安全?

可能会导致链表中的节点指向错误的位置,从而形成一个环形链表,使得查询元素的操作陷入死循环而无法结束。而不是头插法来避免链表倒置,使得插入的节点永远都是放在链表的末尾,避免了链表中的环形结构。数据丢失问题在 JDK1.7 和 JDK 1.8 中都存在,这里以 JDK1.8 为例。中,多个键值对可能会被分配到同一个桶,并以链表或红黑树的形式存储。这是由于当一个桶位中有多个元素需要进行扩容时,多个线程同时对链表进行操作,还是会存在数据覆盖的问题。操作会导致线程不安全,具体来说会有数据覆盖的风险。

2023-10-12 11:24:59 88

原创 java中HashMap的实现原理

每个 Entry其实就是一个 键值对,并且包含一个指向下一个元素的引用,这就构成了链表。当需要取出一个 Entry 对象时,也会根据 hash算法找到其在数组中的存储位置,再根据 equals 方法从该位置的链表中取出 Entry。HashMap 结合了 ArrayList 的查询效率高的特点以及 LinkedList 插入效率高的特点,但是如果我们要存储的数据过于庞大,肯定会造成多次 哈希冲突,这样一来,链表上的节点就会堆积很多,在做查询的时候效率又会变得很低,失去了 HashMap本来的特点。

2023-10-12 10:37:22 155

原创 为什么需要 Buffer Pool?

MySQL 的数据都是存在磁盘中的,那么我们要更新一条记录的时候,得先从磁盘读取该数据,然后再内存中修改这条记录。那修改完这条记录是选择直接写回磁盘还是选择缓存起来呢?当然是缓存起来号,这样下次有查询语句命中这条记录,直接读取缓存中的记录,就不需要从磁盘获取数据了。为此,Innodb 存储引擎设计了一个,来提高数据库的读写性能。

2023-10-10 09:40:25 39

原创 String 类型的变量和常量做 “+” 运算时发生了什么?

对象引用 和 “+” 的字符串拼接方式,实际上是通过 StringBuilder 调用 append() 方法实现的,拼接完成之后调用 toString() 得到一个 String 对象。被 final 关键字修饰后的 String 会被编译器当做常量处理,编译器在程序编译期就可以确定它的值,其效果相当于访问常量。常量折叠会把常量表达式的值求出来作为常量嵌在最终生成的代码中,这时 Javac 编译器对源代码做的极少量优化措施之一。方法是比较的对象的内存地址,而。方法比较的是字符串的值是否相等。

2023-10-06 15:35:21 109

原创 Redis 持久化

当开启了混合持久化时,在 AOF 重写日志时,fork 出来的重写子进程会先将与主线程共享的内存数据以 RDB 方式写入到 AOF 文件,然后主线程处理的操作命令会被记录在重写缓冲区里,重写缓冲区里的增量命令会以 AOF 方式写入到 AOF 文件,写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的 AOF 文件。加载完 RDB 的内容后,才会加载后半部分的 AOF 内容,这里的内容是 Redis 后台子进程重写 AOF 期间,主线程处理的操作命令,可以使得。

2023-09-28 11:24:43 205

原创 Redis 线程模式

之所以 Redis 为 [关闭文件、AOF 刷盘、释放内存] 这些任务创建单独的线程来处理,是因为这些任务的操作都是很耗时的,如果把这些任务都放在主线程来处理,那么 Redis 主线程就很容易发生阻塞,这样就无法处理后续的请求了。图中的蓝色部分是一个事件循环,是由主线程负责的,可以看到网络 I/O 和命令处理都是单线程。后台线程相当于一个消费者,生产者把耗时任务丢到任务队列中,消费者(BIO)不停轮询这个队列,拿出任务就去执行对应的方法即可。的,这也是常说的 Redis 是单线程的原因。

2023-09-26 13:50:48 314

原创 Redis 数据结构

随着Redis 版本更新,后面又支持了四种数据类型:BitMap(2.2版本新增)、HyperLogLog(2.8 版本新增)、GEO(3.2版本新增)、Stream(5.0版本新增)。String类型的底层的数据结构实现主要是 SDS (简单动态字符串)。Redis 提供了丰富的 数据类型 , 常见的有五种数据类型:String(字符串),Hash(哈希),List(列表)、Set(集合)、Zset(有序集合)。Hash 类型的底层数据结构是由。String 类型的内部实现。Set 类型内部实现。

2023-09-22 18:25:39 269 2

原创 什么是 Redis?

Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成的,因此,常用于。Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流)、并且对数据类型的操作都是的,因为执行命令由单线程负责的,不存在并发竞争的问题。

2023-09-22 12:05:31 459

原创 Grom 如何解决 SQL 注入问题

SQL 注入是一种常见的数据库攻击手段, SQL 注入漏洞也是网络世界中最普遍的漏洞之一。SQL 注入就是恶意用户通过在表单中填写包含 SQL 关键字的数据来使数据库执行非常规代码的过程。这个问题的来源就是, SQL 数据库的操作是通过 SQL 命令执行的,无论是执行代码还是数据项都必须卸载 SQL 语句中,这就导致如果我们在数据项中加入了某些 SQL 语句关键字(比如 SELECT,DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。

2023-09-22 10:18:19 735

原创 go语言判断切片是否相同?

【代码】go语言判断切片是否相同?

2023-09-21 14:17:18 144

原创 go语言 rune 类型

ASCII 码只需要 7 bit 就能完整地表示,但只能表示英文字母在内的 128 个字符,为了表示世界上大部分的文字系统,发明了 Unicode ,它是 ASCII 的超集,包含世界上书写系统中存在的所有字符,并且为每个代码分配一个标准编号(称为 Unicode CodePoint),。go 语言中 ,。运行结果为:但是,。

2023-09-21 13:50:29 414

原创 Go中 new() 与 make() 的区别

即类型为 *T 的值。话句话说就是,返回一个指针,该指针指向新分配的、类型为 T 的零值,如数组,结构体等。new(T) 和 make(T,args) 是Go语言内建函数,用来分配内存,但适用的类型不同。make()只适用于 slice 、map 和 channel。,这个值并不是 T类型的零值,也不是指针 *T ,会为 T 类型的新值分配已置零的内存空间,并。

2023-09-19 10:34:28 68

原创 事务隔离级别是怎么实现的?

事务是在 MySQL 引擎实现的,我们常见的 InnoDB 引擎时支持事务的,事务的四大特性是原子性、一致性、隔离性、持久性。当多个事务并发执行的时候,会引发脏读,不可重复读,幻读这些问题,那为了避免这些问题,SQL提出了四种隔离级别,分别是读未提交、读提交、可重复读、串行化、从左往右隔离级别顺序递增,隔离级别越高,意味着性能越差,InnoDB 引擎的默认隔离级别是可重复读。要解决脏读现象,就需要将隔离级别升级到读提交以上的隔离级别,要解决不可重复读现象,就要将隔离级别升级到可重复读以上的隔离级别。

2023-09-14 10:43:44 106

原创 索引失效有哪些?

当使用 左 或者 左右 模糊匹配的时候,也就是 like %xx 或 like %xx% 这两种方式都会造成索引失效;当我们在查询条件中对索引列使用函数,就会导致索引失效。当我们在查询条件中对索引列进行表达式计算,也无法走索引MySQL在遇到字符串和数字比较的时候,会将字符串转换为数字,然后进行比较。如果字符串是索引列,而条件查询时数字,那么索引列会发生优势类型转换,由于隐式类型转换是通过 CAST 函数实现的,相当于对所有列使用了函数,所以就会导致索引失效。

2023-09-11 18:34:12 96

原创 count(*) 和 count(1) 有什么区别?哪个性能最好?

如果表里只有主键索引,没有二级索引时,那么,InnoDB 循环遍历聚簇索引,将读取到的记录返回给 server 层,然后读取记录中的 id 值,判断id值是否为 NULL,如果不为 NULL ,就将 count 变量加 1。前面的案例都是基于 InnoDB 存储引擎的,但是在 MyISAM 存储引擎里,执行 count 函数的方式是不一样的,通常在没有任何查询条件下的 count(*) ,MyISAM 的查询速度要明显快与 InnoDB。当我们在数据表中插入一条数据的同时,将计数表中的计数字段 + 1。

2023-09-11 09:46:02 563

原创 从数据页的角度看 B+Tree

InnoDB的数据是按照 [ 数据页 ] 为单位来读写的,默认数据页大小为 16KB。每个数据页之间通过双链表的形式组织起来,物理上不连续,但是逻辑上连续。数据页内包含用户记录,每个记录之间用单向链表的方式组织起来,为了加快在数据页内高效的查询记录,设计了一个页目录,页目录存储各个槽(分组),且主键值是有序的,于是可以通过二分查找的方式进行行检索,从而提高效率。为了高效查询记录所在的数据页,InnoDB 采用 B+Tree 作为索引,每个节点都是一个数据页。

2023-09-09 21:54:05 156

原创 MySQL 索引

索引的定义就是帮助存储引擎快速获取数据的一种数据结构,形象地说就是索引是数据的目录。所谓的存储引擎,就是如何存储数据、如何为数据建立索引和如何更新、查询数据等技术的实现方法。MySQL存储引擎有 MyISAM、InnoDB 、Memory ,其中 InnoDB 是在 MySQL 5.5 之后成为默认的存储引擎。%5Cinfty。

2023-09-06 15:16:53 297

原创 MySQL一行记录是如何存储的?

所以,在存储数据的时候,也要把数据占用的大小存起来,存到 [变长字段长度列表] 里面,读取数据的时候才能根据这个 [变长字段长度列表] 去读取对应长度的数据。B+ 树中每一层都是通过双向链表连接起来的,如果是以页为单位来分配存储空间,那么链表中相邻的两个页之间的物理位置并不是连续的,可能离得非常远,那么磁盘查询时就会有大量的随机I/O,随机 I/O 是非常慢的。varchar(n) 和 char(n) 的区别:char是定长的,varchar 是变长的,变长字段实际存储数据的长度(大小)不固定。

2023-08-29 20:48:50 677

原创 执行一条 select 语句,期间会发生什么?

执行一条 SQL 查询语句,期间发生了什么?连接器:建立连接,管理连接、校验用户身份;查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;执行 SQL:执行 SQL 共有三个阶段:预处理阶段:检查表或字段是否存在;将select *中的符号扩展为表上的所有列。优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划;

2023-08-26 23:15:32 63

原创 (学习笔记-调度算法)磁盘调度算法

磁盘调度算法

2023-08-26 12:44:37 338

原创 (学习笔记-调度算法)内存页面置换算法

在了解内存页面置换算法前,我们得先了解。当 CPU 访问的页面不在物理内存中时,便会产生一个缺页中断,请求操作系统将缺页调入到物理内存。上面说的过程,第四步是能在物理内存找到空闲页的情况下。如果找不到空闲页的话:如果,就说明此时内存已经满了,这时候,就需要 [] 选择一个物理页,如果该物理页有被修改过(脏页),则把它换出到磁盘,然后把该被置换出去的页表项的状态改成 [无效的] ,最后把正在访问的页面装入到这个物理页中。页表项通常有以下字段:虚拟内存的管理整个流程:所以,的功能是,

2023-08-24 20:38:09 393

原创 (学习笔记-调度算法)进程调度算法

进程调度算法也称 CPU 调度算法,毕竟进程是由 CPU 调度的。当 CPU 空闲时,操作系统就选择内存中标的某个 [就绪状态] 的进程,将其分配给 CPU。什么时候会发生CPU调度呢?其中发生在 1 和 4 两种情况下的调度称为 [非抢占式调度] , 2 和 3 两种情况下发生的调度称为 [抢占式调度]。非抢占式的意思是,当进程正在运行时,它就会一直运行,直到该进程完成或发生某个事件而被阻塞时,才会把 CPU 让给其他进程。

2023-08-22 21:16:19 738

原创 (学习笔记-进程管理)什么是悲观锁、乐观锁?

读优先锁期望的是:读锁能被更多的线程持有,以便提高读线程的并发性,它的工作方式是:当读线程 A 先持有了读锁,写线程 B 在获取写锁的时候,会被阻塞,并且在阻塞过程中,后续来的读线程 C 仍然可以成功获取读锁,最后直到读线程 A 和 C 释放读锁后,写线程 B 才可以成功获取写锁,最后直到读线程 A 和 C 释放读锁后,写线程 B 才可以成功获取写锁。怎么样才算发生冲突?所以说,写锁是独占锁,因为任何时刻只能有一个线程有写锁,类似互斥锁和自旋锁,而读锁是共享锁,因为读锁可以被多个线程同时持有。

2023-08-19 21:35:27 358

原创 (学习笔记-进程管理)怎么避免死锁?

简单来说,死锁问题的产生是由两个或者以上线程并行执行的时候,争夺资源而互相等待造成的。死锁只有同时满足互斥、持有并等待、不可剥夺、环路等待这四个条件的时候才会发生。所以要避免死锁问题,就是要破坏其中一个条件即可,最常用的方法就是使用资源有序分配法来破坏环路等待条件。

2023-08-16 21:11:11 395

原创 go内存管理机制

golang内存管理基本是参考tcmalloc来进行的。。:页,一块 8 K大小的内存空间。Go向操作系统申请和释放内存都是以页为单位。:内存块,一个或多个page组成一个span。如果把page比喻成工人,span可以看成是小队,工人被分成若干个队伍,不同的队伍干不同的活。:空间规格,每个span都带有一个sizeclass,标记着该span中的 page 应该如何使用。使用上面的比喻,就是sizeclass标志着 span 是一个什么样的队伍。

2023-08-13 20:42:06 525

原创 (学习笔记-进程管理)多线程冲突如何解决

对于共享资源,如果没有上锁,在多线程的环境里,很有可能发生翻车。

2023-08-11 21:04:38 1080

原创 (学习笔记-进程管理)进程间有哪些通信方式?

由于每个进程的用户空间都是独立的,不能互相访问,这时就需要借助内核空间来实现进程间通信,原因很简单,每个进程都是共享同一个内核空间Linux内核提供了不少进程间的通信方式,其中最简单的就是管道,管道分为 匿名管道 和 命名管道。匿名管道:他没有名字标识,匿名管道是特殊文件只存在于内存,没有存在于文件系统中,shell命令中的 []竖线就是匿名管道,通信的数据是无格式的流并且大小受限,通信的方式是单向的,数据只能在一个方向上流动,如果要双向通信,需要创建两个管道,再来。

2023-08-09 21:55:34 445

原创 (学习笔记-进程管理)进程调度

进程都希望自己能够占用CPU进行工作,那么这涉及到前面说过的进程上下文切换。一旦操作系统把进程切换到运行状态,也就意味着该进程占用着CPU在执行,但是操作系统把进程切换到其他状态的时候,就不能在CPU中执行了,于是操作系统会选择下一个要运行的进程。选择一个进程运行这一功能是在操作系统中完成的,通常称为。

2023-08-09 10:46:19 313

原创 (学习笔记-进程管理)线程

线程是进程当中的一条执行流程。同一个进程内多个线程之间可以共享代码段、数据段、打开的文件等资源,但每个线程各自都有一套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的。线程的优缺点?一个进程中可以同时存在多个线程各个线程之间可以并发执行各个线程之间可以共享地址空间和文件等资源当进程中的一个线程崩溃时,会导致其所属进程的所有线程崩溃(这里针对C/C++语言)。举个例子,对于游戏的用户设计,则不应该使用多线程的方式,否则一个用户挂了,会影响其他同个进程的线程。

2023-08-06 17:02:35 272

原创 (学习笔记-进程管理)进程

当被阻塞进程所期待的事件出现时,如I/O完成获其所期待的数据已经到达,则由有关进程(如用完并释放I/O设备的进程)调用唤醒语句wakeup,将等待该事件的进程唤醒,首先将被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。一般来说,一个进程并不是自始至终连续不停地运行的,它与并发执行中的其他进程的执行是相互制约的。所以,在虚拟内存管理的操作系统中,通常会把阻塞状态的进程的物理内存换出到硬盘,等需要再次运行的时候,再从硬盘换入到物理内存。

2023-08-04 19:09:22 323

glfw-3.3.8.bin.WIN32

glfw-3.3.8.bin.WIN32 opengl的glfw库

2022-10-07

mongodb-linux-5.0.8

mongodb-linux-5.0.8,搭建分布式mongodb集群可以使用,也可以单独部署

2022-09-03

java_8,包含jre8.0和jdk8.0

java_8,包含jre8.0和jdk8.0.直接解压后配置环境变量即可运行

2022-09-02

mysql5.6压缩版压缩包

mysql5.6压缩版压缩包,解压后修改配置文件,配置环境变量就能直接运行

2022-08-30

linux系统glibc-2.29

linux系统libc库glibc-2.29,glibc,glibc-2.29

2022-08-30

VirtualBox-6.1.4

VirtualBox-6.1.4,虚拟机,games101作业虚拟机

2022-08-16

空空如也

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

TA关注的人

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