自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于博客的测试用例

项目整体基于 HTTP 协议,前端使用 HTML+CSS+JS 构建页面整体布局,后端采用分层结构,分别使用 entity 层、mapper 层、service 层、controller 层、UUID 和 MD5 的加密, 实现将用户信息保存在 Redis 缓存中,实现了拦截器功能,用户未登录时跳。实现关于博客内容的增删改查,添加了分页功能,实现查看内容时阅读量+1,密码实现了基于。章,但是删除只能删除自己的文章,每当用户点击一篇文章,文章的阅读。没有用户时使用 reg 注册用户,示用户并定位到该内容上。

2023-04-19 09:36:25 169

原创 Spring中的事务@Transactional

使用 try catch捕获异常,发现出了异常,但是只是当前执行的事务回滚,添加的事务不回滚,数据库还是添加了数据。添加在方法上时,表示该方法出现了异常或者报错,而导致之前数据库没有进行回滚事件,也就是说如果在方法中,有报错,但是添加了@Transactional 则会开始回滚。3. Isolation.READ_COMMITTED:读已提交,只能读取到已经提交的事务,解决了脏读的问题,但是存在不可重复读的问题。@Transactional 在异常被捕获的情况下,不会进⾏事务⾃动回滚,但是可以手动添加。

2023-03-11 20:20:54 351

原创 HashTable, HashMap, ConcurrentHashMap 之间的区别

HashTable是直接在方法上添加synchronized,相当于是直接对this加锁,this是针对一个对象,也就是相当于针对哈希表对象进行加锁,一个哈希表就只有一个锁,在多线程下,无论这些线程都是怎么操作哈希表都会产生锁冲突,HashTable底层也是一个链表,就类似于给一个对象加了锁,这个对象的每一个元素都是一个链表,无论怎么操作都会造成锁冲突的。ConcurrentHashMap的思路为能不加锁,就不加锁,且很多都是使用到了CAS来实现的。一个线程写,一个线程修改:没有锁冲突。

2023-02-21 17:19:43 351

原创 CAS 和 synchronized 优化过程

当我去银行给别人转账系统卡了我按了两下的取款操作,此时我有1000,然后我给别人转账500,然后我就剩了500,CAS的操作的话判断我之前的1000和之后只有500两个数不相等就不会出现问题,但是当我转账给别人500的时候,此时又有第三人给我转了500,那么我的金额就变回了原来的1000,此时的CAS操作不知道我的1000块是原来的1000还是别人修改的结果;为了解决这个问题我们可以在弄一个内存记录线程的修改次数,当进行了一次修改那么就会+1,然后从这里开始比较的就是修改次数了,就不比较原来的值了。

2023-02-21 14:59:11 266

原创 常见的锁策略

就好比A同志和B同志,A同志睡觉的时候不习惯锁门睡觉,于是门没有锁就直接睡,觉得B同志应该不会来自己的房间(乐观锁)而B同志就习惯了锁门睡觉怕A同志会来打扰自己(悲观锁)重量级锁:加锁和解锁的开销比较大(进入内核的加锁逻辑,开销比较大,因为内核比较忙啥时候给你做这件事不清楚,但一定能给你做了)轻量级锁:加锁和解锁的开销比较小(纯用户的加锁逻辑,开销比较小,自己想去完成一件啥事,自己立马就去做了,自己动手丰衣主食)读写锁相比于普通的互斥锁,减少了很多的锁竞争,优化了效率。写锁和写锁之间,会产生竞争。

2023-02-19 21:32:52 437

原创 关于线程池的执行流程和拒绝策略

如果结果为 false,则新建线程执行此任务,否则将执行线程池的拒绝策略。如果结果为 false,则把任务添加到任务队列中等待线程执行,程池的执行流程是:先判断当前线程数是否大于核心线程数?默认的拒绝策略为 AbortPolicy 中止策略。如果结果为 false,则新建线程并执行任务;如果结果为 true,则判断任务队列是否已满?否则则判断当前线程数量是否超过最大线程数?

2023-02-19 19:07:33 563

原创 wait和sleep的对比

但是wait也可以填写一个参数 表示等待的最大时间(和join类似)如果到了最大时间还没被唤醒那么就不等了,就是wait可以被提前唤醒。sleep是可以通过时间来控制在什么时候唤醒的有一个参数可以填写。wait则是由其他的线程通过notify来唤醒的。

2023-02-16 20:43:36 75

原创 TCP协议的相关机制

7.延迟应答 是一个提高传输效率的机制 也是基于流量控制来引入的提高效率的机制 为了让窗口的大小更大一些(举个例子水桶有20kb的容量 水桶有10kb的水位了 然后此时又来了1kb 其实剩余的大小就只有9kb了 如果立即返回ACK 那么此时的容量大小就为9kb 然后如果我们稍等一会(延迟应答)在返回ACK的话 应用程序就会从缓冲区里取走了一大波的数据 那么我们在返回ACK 此时返回的窗口大小就会变大了)(2)通过指定包的长度 比如在包的开头位置声明长度。也可以通过自定义应用层协议(之前的大佬写的)

2022-10-29 23:41:12 378

原创 关于CSS 选择器的常见用法

这里的意思就是 如果我鼠标指向div里面的文字的时候就会发生变化会实现div:hover里面的内容 如果在点击的话 就会实现div:active里面的内容 button按钮也不例外。在这里我们可以看见 我们设置的大小为200px但是如果使用了*通配符的话 会把整个页面都覆盖成红色。使用#号开头 #id 的形式 并且id是唯一的不可以被多个标签使用。采用 元素1>元素2的方式命名 其中 元素1是父亲 元素2是儿子。采用 元素1,元素2,元素3 的方式 它们是同一级的。使用*来代替所有的标签。

2022-10-29 21:34:10 285

原创 线程不安全的原因及其解决方案

因为程序猿写代码,写好的代码编译过后,在机器上运行,由于水平参差不齐,大佬写的代码非常的高效,而我写的代码效率就比较低,所以写编译器的大佬们就想了一个办法,让编译器具有一定的“优化能力”,比如我写了一些逻辑,然后编译,编译器就会把我写的代码等价转换成另一种执行的逻辑,等价转换过后,逻辑不变 但是效率变高了(现在主流的编程语言都具有优化策略,优化效果做的很好,提升很大)多个线程执行的时候是随机调度的,是没有规律的,所以在写多个线程代码的时候,需要考虑在任意一种调度的情况下,都可以正确的运行出正确的结果。

2022-09-10 17:11:33 1429

原创 Java线程安全

线程安全的意思就是说在多线程的随机调用下,代码没有出现bug 或者说代码没有bug 都能够符合预期的方式来执行的就叫做线程安全。* 因此 两个线程在真正执行这些操作的时候 就可能会有对总执行的排序顺序 也就会造成答案的不稳定 不唯一。* 由于是两个线程进行的去修改变量 而每次修改都是三个操作步骤 因为线程调度的顺序是不稳定的。* 其实执行的 count++ 这个操作的底层 是三条指令 都是在 CPU 上完成的。* (2) 把 CPU 的寄存器中的值进行计算(+1) 这个操作叫做 add。...

2022-08-14 23:58:53 133

原创 Java线程中的状态

在RUNNABLE状态中会产生TIMED_WAITING 和 BLOCKED 和 WAITING 状态 RUNNABLE状态可以在这这个状态之间相互转换。首先刚开始创建的时候 状态为NEW状态 接下来NEW状态完成后进入RUNNABKE状态 在然后运行完了就是TERMINARED状态。如果使用sleep()/带参数的join(time)方法 就会装换为TIMED_WAITING状态。总体的来说 状态就是:就绪状态+堵塞状态(堵塞状态又分为3中具体情况)5.WAITING:特殊的堵塞状态 调用使用wait。.

2022-08-14 23:19:27 103

原创 Thread类的用法

操作系统管理这个线程的PCB的时候是有多个链表的,系统中的PCB分布在就绪队列和堵塞队列(队列中是有链表串联起来的),一个线程在就绪队列中中某一个链表调用了sleep ,则这个PCB就会被移动到堵塞队列中 等到时间一到 就返回就绪队列里面原来的那个位置(且回去了也不一定立马就被执行 得看系统的心情)使用t.join()带参数的意思:就是等到那个时候了 t.join() 线程还没结束 那就不等了,就执行main线程。System.out.println("t 线程执行完了");interrupt()中断。..

2022-08-14 21:58:14 194

原创 线程和进程的区别与联系

在同一个进程的多个线程之间,每一个线程都是共同使用一分内存/文件的,而在进程与进程之间,则是独立的内存/文件。在一个进程中,默认都会有一个线程,也可能会有多个线程。线程比进程更轻量化,所以创建线程更快,销毁也更快。进程是资源分配的基本单位。线程是调度执行的基本单位。首先进程是包含线程的。...

2022-08-14 00:30:00 96

原创 进程与进程调度的基本过程

首先我们要了解一下什么叫做进程进程就是运行起来的程序,好比一个exe为后缀名的文件,如果没有双击运行就不是进程,只有双击运行起来了,就称为一个进程。在同一时刻,系统中的进程有很多,所以需要操作系统的管理分为两方面1.描述:用详细的语言描述清楚一个进程该有的属性和信息通过结构体来进行描述的,结构体里面包含了一个进程的各项信息,把结构体里面又起了一个名为(PCB)进程控制块2.组织:通过一定的数据结构,把很多用来描述的实体放在一起进行增删改查系统中一般会使用双向链表把PCB给组织起来创建一个进程,本质上就是创建

2022-08-12 23:29:30 157

原创 关于数据库的索引和事务

索引:索引是对数据库表中一列或者多列的值进行排序的一个结构一.索引的优点: (1)创建索引可以大幅度的提高系统的性能,可以帮助用户能够更快查询到需要查询数据 (2)通过索引的唯一性,也可以保证数据库中每一行数据的唯一性二.索引的缺点: (1)当数据库中的数据非常大时,创建索引和维护的代价就非常大,可能会导致数据库的卡死 (2)创建索引会造成数据库在空间以及增删改的效率降低索引的核心数据结构为:B+数(在本质上为一个N叉搜索树)-->查找过程和二叉树相似

2022-08-06 20:09:50 320

原创 Java 的浅拷贝和深拷贝

class Money implements Cloneable{ public double money = 99.9; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); }}class Person implements Cloneable { public int age = 10; public.

2022-05-15 19:41:23 113

原创 Java interface接口实现多继承

abstract class Animal { public String name; public int age; public Animal(String name, int age) { this.name = name; this.age = age; } public abstract void eat();}class Dog extends Animal implements IRunning, Iswim.

2022-05-15 17:12:45 930

原创 Java接口interface

1.在接口当中的成员变量默认都是public static final修饰的2.接口当中的成员方法,默认都是抽象方法 public abstract修饰的3.接口当中的普通成员方法,是不能有具体的实现的4.接口当中的普通成员方法,如果要有具体的实现,那么前面要加一个default修饰5.接口当中可以有静态的成员方法,但是不管是静态的还是普通(default)方法,他们都是public修饰的6.接口也是不可以进行实例化操作的7.类和接口使用implements关联8,接口当中不能有

2022-05-15 16:36:01 108

原创 Java抽象类

抽象类:1.使用abstract修饰的方法叫做抽象方法2.方法为抽象类的话,类名也必须为抽象类 使用abstract修饰这个类abstract class Shape01{ abstract public void draw();}3.抽象类是不能够进行实例化操作的,要想使用,只能创建该抽象类的子类,然后让子类重写抽象类的方法4.除此之外,抽象类和普通的类是几乎一样的有方法,成员。5.抽象类不能进行实例化操作,但是可以被继承(也可说抽象类就是为了被继承),在普通方法中

2022-05-15 13:33:26 107

原创 Java多态的使用

class Shape { public void draw() { System.out.println("画图形"); }}class Rect extends Shape { @Override public void draw() { System.out.println("🔶"); }}class Cycle extends Shape { @Override public void draw().

2022-05-15 13:00:57 129

原创 Java内部类

1.实例内部类2.静态内部类3.本地内部类(了解即可)4.匿名内部类(通常使用在接口上)class Outer { public int data1 = 1; private int data2 = 2; public static int data3 = 3; /** * 实例内部类 * 1。实例内部类中 不能定义静态的成员变量 ? * 如果定义静态成员 那么该静态成员应该是被final修饰的 * 2. 实例

2022-05-11 00:06:36 57

原创 Java的代码块

普通代码块(本地代码块) :不是很多见,很少使用public class codeblock { public static void func(int a){ { System.out.println("普通代码块(本地代码块)");//这个大括号里面的这一句就是本地代码块 } } public static void main(String[] args) { int a=1; func

2022-05-10 23:18:25 104

原创 Java 静态成员变量

public class Student01 { public String name; public int age; public String sex; public Student01(String name, int age, String sex) { this.name = name; this.age = age; this.sex = sex; } public static void m.

2022-05-10 22:23:32 2538

原创 Java插入排序

public static void swap(int[] arr,int i,int j){ int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp;}public static void insertSort(int[] arr){ if(arr == null || arr.length < 2){ return; } for(int i=1;i<arr.length;i++){ .

2022-04-22 23:55:48 55

原创 Java冒泡排序

public static void swap(int[] arr,int i,int j){ int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp;}public static void bubbleSort(int[] arr){ if(arr == null || arr.length<2) { return; } for(int i=arr.length-1;i>=0;i--){.

2022-04-22 22:34:50 47

原创 Java选择排序

public static void selectSort(int[] arr){ if(arr == null || arr.length < 2){ return; } for(int i=0;i<arr.length;i++){ int minValueIndex=i;//如多只有一个数那这个数就是最小的,先定义为第一个 for(int j=i+1;j<arr.length;j++){ .

2022-04-22 13:40:14 566

原创 Java的杨辉三角形

public static void main(String[] args) { Scanner sc = new Scanner(System.in); //输入杨辉三角的行数 int n=sc.nextInt(); int arr[][]=new int[n][]; for(int i=0;i<n;i++){ //不用向之前那样创建一个二维数组类似于向长方形的(浪费空间) //因为我们只需要使用到下半部分的内容,所以我们实例.

2022-04-21 22:07:56 545 1

原创 java杨氏矩形

public static void main(String[] args) { int[][] arr={{1,2,3},{4,5,6},{7,8,9}}; Scanner sc=new Scanner(System.in); int k=sc.nextInt(); int ret=Fin_Num(arr,3,3,k); if(ret==1) System.out.println("找到了"); else ..

2022-04-21 18:34:35 193

原创 BC98 序列中删除指定数字

//删除指定的数字public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n = sc.nextInt(); int[] arr = new int[n]; for(int i=0;i<n;i++){ arr[i]=sc.nextInt(); } int m= sc.nextInt(); for(int i=0;i<a.

2022-04-21 15:12:50 54

原创 BC100-有序序列合并

public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int m=sc.nextInt(); int[] arr=new int[n+m]; for(int i=0;i<arr.length;i++){ arr[i]=sc.nextInt(); } Arrays.sort(arr); .

2022-04-21 15:06:45 79

原创 在字符串中查找子字符串

//查找子串#include<stdio.h>char* Search(char* str1, char* str2) { char* s1 = str1; char* s2 = str2; char* cur = str1; while (*cur) { s1 = cur; s2 = str2; while (*s1 && *s2 && (*s1 == *s2)) { ...

2022-04-20 18:54:27 3354

原创 输入一个数判断与斐波那契数列最小的距离

//输入一个数判断斐波那契数列数组中最小距离//0 1 1 2 3 5 8 13 21 34int main() { int a = 0, b = 1, c = 1, n = 0; scanf("%d", &n); while (1) { if (b == n) { printf("0"); break; } else if (b > n && n &gt...

2022-04-20 13:46:03 64

原创 数组逆置改进版

#include<stdio.h>#include<string.h>//例子:Hello World Hehe//结果 Hehe World Hellovoid reverse(char* left, char* right) { while (left < right) { int temp = *left; *left = *right; *right = temp; left++; ...

2022-04-20 13:32:59 164

原创 将字符串中的每一个字符进行逆置

#include<stdio.h>#include<string.h>//例子:I Like You//结果 You Like Ivoid reverse(char* left, char* right) { while (left < right) { int temp = *left; *left = *right; *right = temp; left++; right--;...

2022-04-20 13:27:37 323

原创 //写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明

我们首先要理解这个函数offsetof是计算偏移量的#include<stdio.h>#include<stddef.h>struct S{ int a; char c; double d;};#define OFFSETOF(st_type,men_name) (size_t)&(((st_type*)0)->men_name)int main() { printf("%d\n", OFFSETOF(struct S...

2022-04-16 20:29:35 494

原创 //写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换

#include<stdio.h>#define swap(num) (num=((num&0x55555555)<<1)+((num&0xaaaaaaaa)>>1))int main() { int num = 9; //00000000 00000000 00000000 00001111 //01010101 01010101 01010101 01010101 0x55555555 //10101010 101...

2022-04-16 20:22:29 131

原创 Java找单身狗

package Demo01;public class 寻找单身狗 {// public static int Sing_Dog(int[] arr){// int ret=0;// for(int i=0;i<arr.length;i++){// ret^=arr[i];// }// return ret;// } public static void Sing_Dog(int[] .

2022-04-09 21:50:55 915

原创 C语言实现找单身狗

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>//int Alone(int arr[], int len) {// int n = 0;// for (int i = 0; i < len; i++) {// n ^= arr[i];// }// return n;//}//int main() {// int arr[] = { 1,2,3,4,5,1,2,3,4 };...

2022-04-09 19:59:02 163

原创 C文件操作File

为什么要使用文件呢? 因为我们的数据写到文件里可以持久化,会一直保留着比如我们做一个通讯录系统每次打开就得重新输入信息,我们就可以使用文件输入信息实现可持久化,这样下次打开数据就不会消失了首先了解 一下文件指针:每个被使用的文件都在内存中开辟了一个相应的文件信息区,这些信息区是用来存放文件相关的信息(比如文件名,文件的状态,文件的位置等等)。这些文件是保存在一个结构体变量中的,那这个结构体类型是由系统声明的,并且取名叫做FILE。 每当打开一个文件的时候,系统会根据文件情况自动去创建一个FILE

2022-04-09 19:48:57 3537

空空如也

空空如也

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

TA关注的人

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