自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 论坛项目知识回顾

目录一. MySQL 建表二. MyBatis三. dao层四. service层五. controller层六 component层七. configuration层八. utils 包九. common 包十. Exception十一. interceptor包十二. 代码有使用什么SpringBoot注解首先使用 MySQL 进行表的创建, 有以下几个表:t_user: 用户信息表, 用来存储用户的姓名, 密码,昵称,电话号码,邮件,个人简介t_board: 板块表, 存储每个板块的名字, 板块中的文

2023-10-02 20:43:11 146

原创 针对论坛系统进行功能测试和性能测试

可以对自己的用户信息可以进行用户名、昵称、密码进行更改, 也可以对自己发布的帖子的区域、标题和内容进行更改。

2023-08-22 19:24:06 851

原创 消息队列项目(3)

由于 Message 以后会是一个比较庞大的数据, 放在数据库里并不合适, 因此我们要将它放在二进制文件中因为 Message 和 Queue 是捆绑在一起的, 因此我们将目录名设置成 QueueName, 然后这些目录是存储在之前的 data 里就像这样:queue_data.txt 中包含的是消息具体内容然后我们规定在消息具体内容中的数据存储方式:前面是消息长度, 后面接上消息的二进制数据, 这样才取出数据的时候也能计算出这些消息的。

2023-08-05 10:27:44 147

原创 消息队列项目(2)

我们使用SQLite来进行对 Exchange, Queue, Binding 的硬盘保存对 Message 就保存在硬盘的文本中。

2023-08-04 14:30:48 970

原创 消息队列项目(1)

这里的消息队列, 大致上就是一个生产者消费者模型.我这个消息队列是仿照RabbitMQ的实现原理来进行编写的。

2023-08-03 20:11:28 266

原创 MySQL 约束、聚合查询和联合查询练习

设置一个考勤系统, 包含员工表,考勤记录表首先要明白, 员工表对考勤记录表是一对多员工表中起码包含 id , name考勤记录表则包含 id, 日期, 考勤记录考勤记录表为子表, id 则为外键约束员工表为父键, id则为主键约束搞明白这些, 接下来就是创建数据库和表:然后往里面添加数据 : 查询 zhangsan 的出勤率首先要明白, 出勤率为 出勤次数/天数出勤次数的查询为:天数的查询为: 利用子查询, 子查询就相当于语句嵌套.将出勤次数嵌入到天数的查询中达到 出勤次数/天数 的效果就能得到出勤率:

2023-07-16 09:44:36 109

原创 JVM知识点汇总(2)

目录一. 垃圾回收的优点和原理. 并考虑两种回收机制二. 垃圾回收器的基本原理是什么? 垃圾回收器可以马上回收内存吗? 有什么办法主动通知虚拟机进行垃圾回收?三. Java 中会存在内存泄露嘛? 请简单描述四.Ststem.gc() 和 Runtime.gc() 会做什么事情五. finalize() 方法是什么时候被调用? 析构函数(finalization) 的目的是什么六. 什么是分布式垃圾回收(DGC)? 它是如何工作的?七. 串行(serial) 收集器和吞吐量(throughput) 收集器的区

2023-07-04 10:31:32 594

原创 JVM知识点汇总(1)

任何一个工程项目都是由许多类组成的, 当程序启动时, 只把需要的类加载到 JVM 中, 其他类只有被使用到的时候才会被加载, 采用这种方法一方面可以加快速度, 另一方面可以节约程序运行时对内存的开销. 此外, 在 Java 程序语言中, 每个类或接口都对应一个 .class 文件, 这些文件可以被看成是一个个可以被动态加载的单元, 因此只有部分类被修改时, 只需要重新编译变化的类即可, 而不需要重新编译所有文件, 因此加快了编译速度.public static int value = 456;

2023-07-03 19:31:23 444

原创 浅谈乐观锁与悲观锁

总是假设最坏情况, 每次去拿数据的时候都认为别人会修改, 所以每次在拿数据的时候都会上锁, 这样别人拿数据的时候就会阻塞, 直到锁被释放. 传统数据库用到了很多这种锁机制, 比如行锁, 表锁, 读锁, 写锁等, 都是在做操作之前先上锁. Java 中 synchronized 和 ReentrantLock 等独占锁就是悲观锁思想的实现.

2023-06-29 18:35:57 106

原创 集合框架知识汇总

首先, List 和 Set 具有相似性, 它们都是单列元素的集合, 所以它们有一个共同的父接口 Collettion. Set 里面不允许有重复的元素, 所谓重复就是不能有两个相等(存的值相同) 的对象, 即 Set 集合中有了一个 A对象, 现在要向 Set 集合再存入一个 B 对象, 但 B 对象 与 A 对象 equals 相等, 则 B 对象存不进去, 当成功存入时 add() 方法会返回一个 true, 否则返回 false;但是插入元素要设计数据元素等内存操作, 所以索引数据快而插入数据慢.

2023-06-28 19:36:06 53

原创 线程池知识点汇总

FixedThreadPool 是固定大小的线程池, 只有核心线程. 每次提交一个任务就会创建一个线程, 知道线程达到线程池的最大大小. 线程池的大小一旦达到最大值就会保持不变, 如果某个线程因为执行异常而结束, 那么线程池会补充一个新的线程池。这个线程池只有一个核心线程在工作, 也就是相当于单线程串行执行所有任务. 如果这个唯一的线程因为异常结束, 那么会有一个新的线程来代替它. 此线程池保证所有任务的执行顺序按照任务的提交顺序执行.: 线程池运行的最大线程数.: 线程池的核心线程数.

2023-06-28 10:41:01 50

原创 synchronized 知识点汇总

在虚拟机执行到 monitorenter 指令时, 首先要尝试获取对象的锁, 如果这个对象没有被锁定, 或者当前线程已经拥有了这个对象的锁, 把锁的计数器 +1 , 当执行 monitorexit 指令时将锁计数器 -1;非公平主要表现在获取锁的行为上, 并非是按照申请锁的前后给等待线程分配锁的, 每当锁被释放时, 任何一个线程都有机会竞争到锁, 这样做的目的是为了提高执行性能, 缺点是可能会产生线程饥饿现象.如果获取对象失败, 那当前线程就要阻塞等待, 知道对象锁被另外一个线程释放为止.

2023-06-27 19:34:26 33

原创 并发编程知识点汇总(1)

如果线程遇到了 IO 阻塞, 我不认为有一种方法可以中断线程. 如果线程因为调用 wait(), sleep(), join() 方法而导致的阻塞, 可以中断线程, 并且通过抛出 InterruptedException 来唤醒它.在某个属性被多个线程共享, 其中一个线程修改了此属性, 其他线程可以立即得到修改后的值. 因此如果是对一个共享变量进行多个线程的赋值, 而没有其他的操作, 那么可以用 volatile 来代替。不可变对象天生是线程安全的, 所以在使用时不需要进行加锁等消耗资源的操作.

2023-06-27 15:18:05 51

原创 InnoDB索引与MySAM索引实现的区别是什么?

6.MylSAM的回表操作是十分快速的, 因为是拿着地址偏移量直接到文件中取数据的, 反观InnoDB是通过获取主键之后再去聚簇索引里找记录, 虽然说也不慢, 但还是比不上直接用地址去访问。5.InnoDB的非聚簇索引data域存储相应记录主键的值, 而MylSAM索引记录的是地址, 而MylSAM索引文件和数据文件是分离的, 索引文件仅保存数据记录的地址。4.InnoDB的数据文件本身就是索引文件, 而MylSAM索引文件和数据文件是分离的, 索引文件仅保存数据记录的地址。

2023-06-23 14:17:15 55

原创 HTTPS的加密流程

因为对称加密的速度快,成本低,而非对称加密的速度慢,成本高,所以就只用非对称加密对key进行加密,对数据的加密和解密还是使用key。这个证书中包括了服务器的公钥,在客户端拿到证书后,就拿系统带的公钥将其解密,拿到服务器的公钥。是针对证书的所有属性,计算一个校验和,再由证书的颁布机构使用手里的私钥,对这个签名进行加密。那么黑客是不是也能用系统的公钥将证书中的公钥进行解密,然后把服务器的公钥替换成自己的呢。服务器的url,证书的过期时间,颁布证书的机构,服务器自己的公钥,和加密后的签名等等。

2023-05-28 18:00:46 29

原创 fiddler的用法和HTTP协议的基本格式

fiddler是一个抓包工具,fiddler是专门用来对http和tttps抓包的,从抓来的包里我们可以知道http协议的基本格式。

2023-05-28 15:29:00 179

原创 CSS选择器

一个html标签,可以有一个id属性,这个属性的值,作为标签的"身份标识"在页面中是唯一的.这是一个复合选择器,效果就是把上述三种基础选择器,进行组合,同时能够体现出"标签的层次结构"CSS中创建一个"类名",这个类名对应一组CSS属性,让指定的html元素应用这样的类名。所以也可以通过id选择器把这个指定的元素给获取到。使用标签名,把页面中所有同名标签的元素都选中了。缺点:难以针对某个元素进行个性化定制。

2023-05-23 10:04:29 23

原创 html常用标签

dl>标题实例:

2023-05-20 15:58:45 33

原创 数据链路层详解

由于拆出的这些IP数据报只有一份UDP首部,这个UDP首部里能够填写UDP长度的地方,也还是只有2个字节,只能装下64K大小的数据。如果承载的数据长度超过MTU,就会在IP层进行分包,使每个分出来的结果都能在MTU之内。6个字节比4个字节大了6w多倍,所以虽然IPv4不够用了,但是mac地址目前是够用的。虽然MTU有限制但是没关系,IP仍然可以保证传输一个更大的数据。虽然IP能拆包,但仍然不能改变UDP最大长度是64K这样的现实。所以mac地址也不需要动态分配,都是在网卡出厂的时候就写死了。

2023-05-12 10:11:14 35

原创 IP协议详解

每个网络上的设备,要能分配一个通常,会把32位整数,转换成点分十进制的表示方式三个点,把这个整数分成4个部分,每个部分,一个字节,每个部分的取值范围0-25532位整数最多能表示约42亿9千万不同的地址但全世界有很多的电脑,很多的服务器,很多的路由器,还有很多的手机如何解决上述问题?

2023-05-11 19:44:43 80

原创 UDP详解

每个端口在UDP报文里占两个字节其实端口号的取值范围 0->65536

2023-05-11 16:24:48 107

原创 TCP协议详解

而可靠传输是TCP的初心,也是最核心的机制这里的可靠传输,不是说100%的传过去(很难实现)而是尽可能的传过去,如果没有传送过去,发送方至少能自动自己没传过去。

2023-05-09 18:04:30 488

原创 TCP/IP 五层网络模型详解

TCP/IP五层网络模型是当下最广泛使用的网络模型,而OSI七层网络模型是仅存在于教科书上的为何需要ICP/IP五层网络模型:在网络通信中的环境其实是非常复杂的,面对复杂的环境,就需要复杂协议;于是就把协议拆分成了多个协议,针对这些小的协议进行分类;同时针对这些不同的类别进行分层:相当于约定了层级和层级之间的调用关系,,不能跨层调用。

2023-05-09 10:29:23 1625 1

原创 文件内容操作(java)

针对,提供了一组类,统称为"字符流"读写的基本单位:字符典型代表:Reader,Writer针对,提供了一组类,统称为"字节流"读写基本单位:字节典型代表:InputStream,OutputStream字节流有很多种读法:读一个100个字节的数据1.一次性读100字节2.一次读50字节,读两次3.一次读20字节,分5次读.......每种流的对象又分为两种:输入:Reader和InputStream输出:Writer,OutputStream。

2023-05-07 17:31:47 49

原创 文件操作(java)

我们平时谈到的"文件",指的是硬盘上的文件硬盘(外存)和内存相比:速度:内存比硬盘快很多空间:内存空间比硬盘小成本:内存比硬盘贵持久化:内存掉电后数据丢失,外存掉电后数据还在。

2023-05-07 11:18:19 27

原创 CAS如何实现

这样做的目的就是防止在count++的过程中count的值由于别的操作发生了变化,如果这时候将count的值变成count++后的值就导致count的值不准确。在进行++操作后,先看看address里的值是否等于expectValue,如果发生了变化,就不和swapValue进行交换。但是真正的CAS操作其实是一条CPU指令,这一条指令就能完成上述这一段代码的功能。expectValue就是进行++操作时刚拿进去的值。期望值,开始拿进来的时候的值。内存地址,储存的是现在的值。交换值,进行操作后的值。

2023-05-06 20:03:40 78

原创 synchronized详解

1.开始时是乐观锁,如果锁冲突频繁,就转换成了悲观锁2.开始时是轻量级锁,如果锁被持有的时间较长,就转换为重量级锁3.实现轻量锁的时候,大概率用的是自旋锁策略4.是互斥锁5.是可重入锁6.是非公平锁。

2023-05-06 18:36:53 23

原创 死锁的成因和解决方案

这种情况是当这个线程使用锁后没有进行解锁,然后再次使用锁的时候就会出现死锁的情况.当然,这个只能针对不可重入锁,对于可重入锁不造成影响.出现以下代码时就可能造成死锁当t1和t2同时进行第一把加锁就会出现死锁的情况线程数量和锁数量更多了,就更容易死锁了著名的哲学家的就餐问题这五个哲学家随机的拿起筷子吃饭和放下筷子如果他想拿起筷子,被别人占用了,就会就行等待,等的过程中不会放下已经拿起的筷子;假设这五个哲学家同时拿起左手边的筷子就死锁了但在线程中更加复杂,更容易出现死锁。

2023-05-06 17:43:36 119

转载 HashMap、ConcurrentHashMap、HashTable的区别

在jdk5后出现一些很好的并发集合,对大容量、低延迟的电子交易系统有很大影响,是快速存取数据的支柱。虽然三个集合类在多线程并发应用中都是线程安全的,但是他们有一个重大的差别,就是他们各自实现线程安全的方式。坦白说,集合类是一个最重要的Java API,我觉得恰当的使用它们是一种艺术。主要的区别在于HashMap不是同步的、线程不安全的和不适合应用于多线程并发环境下,而。的细节和对比它们之间的参数比如线程安全、同步、性能和基本的使用。差别不大,也是在并发中作类似的操作,两者的唯一区别就是。

2023-05-05 19:18:08 60

原创 线程池(java)

核心线程数 可以看作是一个公司的正式员工最大线程数 正式员工+实习生这里解释一下所谓的正式员工和实习生如果当前任务比较多,线程池就会多创建一些"临时线程",也就是实习生如果当前任务少,比较空闲了,线程池就会把多出来的临时线程销毁掉;公司在比较忙的时候就会招一些实习生来缓解压力,但一旦空闲下来,实习生就会面临被辞退的风险临时线程保持存活的时间当公司空闲时,实习生不是立马被辞退,描述了允许实习生最大的摸鱼时间单位:s,min,ms线程池要管理很多任务 这些任务也是通过阻塞对略来组织的。

2023-05-05 18:21:31 32

原创 单例模式(java)

单例模式是一种经典的设计模式;设计模式就是软件开发中的棋谱,针对一些常见的场景,总结出来的代码编写套路设计模式有很多种,在校招阶段主要考察两个设计模式.1.单例模式2.工厂模式单例模式:单例 -> 单个实例 -> 一个对象也就是一个程序中的某个类,只能创建出一个对象,不能创建多个对象能够从语法上禁止多创建对象。

2023-05-04 15:27:13 24

原创 解决线程不安全

synchronized是java中的关键词,我们可以直接使用这个关键词来实现加锁的效果加锁的目的是什么?

2023-05-04 13:44:54 17

原创 线程安全问题的原因

像上述++操作,里面可以拆分为三个操作 load,add,save,所以不是原子的,在进行某个操作的时候cpu随时可能会去执行别的操作。由于随机调度的原因,线程中的代码执行到任意一行,都随时可能会被切换出去,这样就可能导致在切换出去后切换回来的过程中值发生修改。由于t1的步骤3已经完成,student已经是非空了,但student还没有被成功初始化,这个内存里什么都没有。本以为结果会是2w,但每次运行的结果都不一样,这就是线程不安全导致的结果。步骤1肯定是先执行,但步骤2和步骤3的先后顺序就是未知的。

2023-05-04 11:50:32 40

原创 多线程(java)

同一个进程里的多个线程之间,一个线程挂了,可能会把整个进程带走,影响到其他线程。当我们创建第一个线程的时候,操作系统就会申请系统资源去建立一个进程,当后续在创建线程,就不必再申请资源了,创建和销毁的效率就提高了不少。但一个进程可能会打开很多文件,这样就会产生一组文件描述符,把这些文件描述符放到一个顺序表这样的结构里,就构成了文件描述符表。而且每次使用一个进程时,就得进行创建,不使用的时候就得进行销毁,这样是非常耗费时间的;而每当我们创造一个进程的时候,就会消耗相对较多的资源,但我们可能会不能完全利用起来;

2023-05-03 16:47:10 38

原创 排序(2)

冒泡排序 快速排序 归并排序

2023-02-27 15:12:47 33

原创 排序(1)

直接插入排序 希尔排序 选择排序 堆排序

2023-02-26 22:20:15 29

原创 二叉树练习(2)

二叉树练习:一 二叉树的层序遍历二 从前序和中序遍历中构造二叉树三 中序和后序遍历构造二叉树

2023-02-25 23:02:06 58

原创 二叉树练习(1)

二叉树练习:一 判断一棵树是否为平衡二叉树二 另一棵树的子树三 对称二叉树

2023-02-25 14:43:31 47

原创 异常(java)

成为系统异常类的子类//运行时异常/非受查异常}//编译时异常/受查异常}

2022-12-16 13:53:50 52

原创 String类(java)

我们在使用字符串的时候,如果我们不使用new String去赋值的时候,程序会检查一遍字符串常量池里是不是有相同的值,如果有则不生成一个新的对象,而是去使用这个已有的对象。所以 s1 == s2但使用new String的时候会直接生成新的对象所以 s1!= s3。

2022-12-13 22:20:00 64

空空如也

空空如也

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

TA关注的人

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