自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 网页五子棋对战项目测试(selenium+Junit5)

该项目为一个SSM项目,玩家之间可以进行实时的五子棋对战,拥有对战观战、对战回放、聊天、天梯分等功能。

2024-06-11 11:15:06 1112

原创 定时器的使用和实现

定时器的使用和实现

2024-06-07 10:53:19 1032

原创 一文学会Spring 实现事务,事务的隔离级别以及事务的传播机制

示例:方法testA的事务级别为Propagation_REQUIRED,方法testB的事务级别为Propagation_NEVER,testA方法中调用testB方法,因为testB方法的事务级别为Propagation_NEVER,所以已进入testB方法就会。示例:方法testA没有声明事务,方法testB的事务级别为Propagation_MANDATORY,testA方法里面调用testB方法,在执行testB方法的时候就会直接抛出事务要求的异常,testB方法里面的操作就没有被执行。

2024-06-07 10:50:14 1106

原创 线程池详解

线程池可以自定义线程数目,通过实验+压测设置线程数目线程的数目是不能具体确定的,因为不同电脑主机的CPU的配置是不确定的,程序的执行特点不确定代码里具体做了什么:是CPU密集型的任务(做了大量的算数运算和逻辑判断)还是IO密集型的任务(做了大量的读写网卡/读写硬盘), 这两种任务各自所占的比例是难以量化的如果任务100%是CPU密集型的话,线程数目最多就是N,因为CPU已经被占满了,如果CPU密集型所占比例很少,IO密集型的所占比例很多(不使用CPU),则线程数目可以多些。

2024-06-07 10:49:12 550

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

HashTable的扩容操作:当put元素的时候,发现当前的负载因子已经超过了阈值,就需要触发扩容, 它会申请一个更大的数组,然后把之前旧的数据给搬运到新的数组上。这个操作有一个很大的问题:如果元素的个数足够多,搬运的开销就会很大,本来执行一个put操作的时间复杂度时O(1),但是触发扩容的这次put, 就。进行哈希表操作的时候,都会把旧的内存上的元素搬运一部分到新的空间上,直到最终搬运完成, 才会释放旧的空间。,分段锁是好几个链表共用一把锁,发生锁冲突的概率比每个链表一把锁更高,代码实现起来更复杂。

2024-06-07 10:48:19 543

原创 在线OJ项目测试(selenium+Junit5)

测试发表评论,刷新评论详情页,查看是否可以点击评论,进入到评论详情页,检查页面的元素是否存在。通过EdgeDriver以及URL进行页面的访问,查看页面中的元素以及交互是否符合预期。通过参数化进行测试,如果登录失败则会弹出警告,点击确认之后页面不会更改。通过参数化进行测试,如果注册失败则会弹出警告,点击确认之后页面不会更改。点击历史提交记录,跳转到提交详情页,检查提交详情页中的元素是否存在。测试代码的提交按钮,点击提交后刷新页面,页面会更新历史提交记录。首先通过EdgeDriver以及URL打开登录界面。

2024-06-07 10:37:39 1114

原创 CAS 的使用场景 & CAS的ABA问题的优化 以及 synchronized 的三大优化

CAS(Compare-And-Swap),是比较和交换的意思,它是一条CPU并发原语,用于判断内存中某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的.它包含了三个参数:V,A,B。V表示要读写的变量内存地址A表示旧的预期值B表示准备设置的新值。

2023-01-04 21:57:16 5800 24

原创 死锁的成因以及解决方案

死锁是一个线程加上锁了之后,解不开了在多线程编程中,我们为了防止多线程竞争共享资源而导致数据错乱,都会在操作共享资源之前加上互斥锁,只有成功获得到锁的线程,才能操作共享资源,获取不到锁的线程就只能等待,直到锁被释放。

2022-12-29 16:36:39 5581 13

原创 synchronized 和 ReentrantLock 的区别

2.ReentrantLock 可以实现公平锁,它默认是非公平的,在构造的时候给它传入一个参数true就变公平锁了。1.tryLock 试试看能不能加上锁,试成功了,就加锁成功,试失败了,就放弃加锁,并且还。(在开发过程中,"死等的策略"需要特别注意,tryLock就提供了应对的方法)虽然ReentrantLock有缺点,但是它有一些特定的功能是。synchronized和ReentrantLock的。(通过C++实现的),而ReentrantLock是。ReentrantLock 搭配的是。

2022-12-26 16:22:42 4804 5

原创 常见实用的锁策略详解

在我们等人的时候,对方还没有到约定地点,一直反复的打电话催促就是自旋锁,而当你发现对方还没到的时候,就在约定的地点找个地方玩手机,叫他来了再在约定的地点旁边找我们一下,多消耗一点时间,却能够用这些时间去做其他的事情,时间被利用起来了,这就是挂起等待锁。如果程序抛出了异常,没有人catch就脱离了之前的代码块,脱离了一层代码,计数器就-1,脱离到计数器为0,也就解锁了,同理加锁代码中出现异常,也是不会死锁的,因为Java使用关键字结合代码块来做解锁操作,这两种锁是站在加锁解锁的角度看待的,看的是加锁解锁的。

2022-12-22 00:14:06 5199 11

原创 阻塞队列的使用

1.线程是安全的2.当进行入队操作的时候,队列为满,入队操作就阻塞,直到队列非满的时候入队操作才完成3.当进行出队操作的时候,队列为空,出队操作就阻塞,直到队列非空的时候出队操作才完成生产者消费者模型:例如:3个人包饺子,其中有一个人需要生产饺子皮,他就是生产者,另外的两个人就是消费者,而生产者生产的饺子皮放在桌子上,桌子就是"交易场所".如果生产者生产过快饺子皮已经放满了桌子,他就能进行阻塞等待,如果是饺子皮的生产速度慢于包饺子的速度,那消费者就能够进行阻塞等待。

2022-12-19 18:45:19 6881 32

原创 CountDownLatch类的使用

CountDownLatch是一种用来控制多线程的工具类,它被称为门阀、计数器或者闭锁.

2022-12-17 20:36:42 7384 17

原创 单例模式的创建(饿汉模式&懒汉模式)

单例模式的创建(饿汉模式&懒汉模式)

2022-12-16 23:15:05 7195 11

原创 Volatile关键字的作用

volatile关键字的使用

2022-12-09 22:44:21 6490 9

原创 wait与notify的使用

wait与notify的使用

2022-12-06 23:29:20 7973 12

原创 Iterable、Collection、List 的常见方法签名以及含义

Iterable、Collection、List 的常见方法签名以及含义

2022-07-03 22:45:43 6346 3

原创 Java数组的定义与使用

一.数组的定义1.创建数组数组定义有三种方法:int[] array1 = new int[10];//前面的int[]为数组的类型,后面的int[10]为其能够存放的大小,array1为其数组名称int[] array2 = {1,2,3,4,5};int[] array3 = new int[]{1,2,3,4,5};2.初始化数组初始化数组有动态初始化和静态初始化两种动态初始化:在创建数组时,只定义数组中元素的个数,并未给里面的元素进行赋值例如:int[]

2022-05-12 11:29:40 34730 14

原创 文件操作详解(2)

1.文件的随机读取1.1 fseek根据文件指针的位置和偏移量来定位文件指针文件的默认读取是从首元素开始读取的例如:#include<stdio.h>#include<stdlib.h>int main(){ FILE* pf = fopen("test.txt", "r");//以读的方式 if (pf == NULL) { perror("fopen"); return 1; } char ch = fgetc(pf);//读取一个字

2022-04-18 14:13:06 6696 46

原创 文件操作详解(1)

文件操作详解

2022-04-16 23:50:59 6994 22

原创 简单易懂的内存函数的使用

1.memcpy该函数用来source的位置开始向后复制num个字节的数据到destination的内存位置该函数遇到'\0'的时候不会停下来如果source和destination有任何的重叠,其结果都是未定义的#include<stdio.h>#include<string.h>int main(){ char arr1[]="abcdef"; char arr2[30]={0}; memcpy(arr2,arr1,6); printf("%s\n

2022-04-13 15:24:25 7683 24

原创 C语言实现通讯录(静态版本+动态版本)

当前使用VS2019编译器首先建立2个源文件test.c和contect.c以及1个头文件contect.h一.通讯录操作菜单void menu(){ printf("******** 1.Add 2.Del ***********************\n"); printf("******** 3.Search 4.Modify ***********************\n"); printf("******** 5.Sort 6.Print

2022-04-03 23:20:06 7657 22

原创 常用字符串函数的使用

常用字符串函数的使用

2022-04-03 21:06:35 8727 14

原创 数据的存储

一.数据类型(1)整型类型:char,short,int,long这些类型还分为有符号的和无符号的,例如:signed char,unsigned char其中short,int,long这三中类型在编译器中默认为无符号的,char类型默认为有符号还是无符号的取决于编译器signed char的范围为-128到127,unsignedchar的范围为0到255(2)浮点型类型:float,double,long double(3)构造类型(自定义类型):^数组类型^结构.

2022-03-05 21:09:12 6615 1

原创 C语言中十分详细的操作符详解

一、算数操作符1.加法操作符+int a=2+3//右边的2和3相加后赋值给整形变量a,所以a的值为52.减法操作符-int a=3-2//右边的3和2相减后赋值给整型变量a,所以a的值为13.乘法操作符*int a=2*3//右边的3和2相乘后赋值给整型变量a,所以a的值为64.除法操作符/int a=7/3//右边7除以3 商2余1,将商赋值给整型变量a,所以a的值为25.求余操作符%int a=7%3//右边7模3 商2余1,将余数赋值给整型变量a,所以a的值为

2022-01-14 18:54:11 8743 20

原创 C语言的常量和类型

C语言的中各种常量和类型

2021-12-14 22:59:18 10151 4

原创 第一篇博客

简单的介绍以及未来的目标

2021-12-11 16:19:26 6995 3

空空如也

空空如也

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

TA关注的人

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