山涧晴岚.
码龄3年
关注
提问 私信
  • 博客:184,338
    184,338
    总访问量
  • 26
    原创
  • 73,495
    排名
  • 1,155
    粉丝
  • 4
    铁粉
  • 学习成就
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:福建省
  • 加入CSDN时间: 2021-10-14
博客简介:

qq_62949535的博客

查看详细资料
  • 原力等级
    成就
    当前等级
    4
    当前总分
    737
    当月
    9
个人成就
  • 获得586次点赞
  • 内容获得307次评论
  • 获得968次收藏
  • 代码片获得1,221次分享
创作历程
  • 6篇
    2024年
  • 1篇
    2023年
  • 17篇
    2022年
  • 2篇
    2021年
成就勋章
TA的专栏
  • 项目测试
    2篇
  • 多线程
    11篇
  • Spring
    1篇
创作活动更多

如何做好一份技术文档?

无论你是技术大神还是初涉此领域的新手,都欢迎分享你的宝贵经验、独到见解与创新方法,为技术传播之路点亮明灯!

182人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

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

该项目为一个SSM项目,玩家之间可以进行实时的五子棋对战,拥有对战观战、对战回放、聊天、天梯分等功能。
原创
发布博客 2024.06.11 ·
1314 阅读 ·
27 点赞 ·
0 评论 ·
16 收藏

定时器的使用和实现

定时器的使用和实现
原创
发布博客 2024.06.07 ·
1116 阅读 ·
17 点赞 ·
0 评论 ·
14 收藏

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

示例:方法testA的事务级别为Propagation_REQUIRED,方法testB的事务级别为Propagation_NEVER,testA方法中调用testB方法,因为testB方法的事务级别为Propagation_NEVER,所以已进入testB方法就会。示例:方法testA没有声明事务,方法testB的事务级别为Propagation_MANDATORY,testA方法里面调用testB方法,在执行testB方法的时候就会直接抛出事务要求的异常,testB方法里面的操作就没有被执行。
原创
发布博客 2024.06.07 ·
1166 阅读 ·
14 点赞 ·
0 评论 ·
31 收藏

线程池详解

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

HashTable, HashMap, ConcurrentHashMap 之间的区别

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

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

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

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

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

死锁的成因以及解决方案

死锁是一个线程加上锁了之后,解不开了在多线程编程中,我们为了防止多线程竞争共享资源而导致数据错乱,都会在操作共享资源之前加上互斥锁,只有成功获得到锁的线程,才能操作共享资源,获取不到锁的线程就只能等待,直到锁被释放。
原创
发布博客 2022.12.29 ·
5721 阅读 ·
15 点赞 ·
13 评论 ·
14 收藏

synchronized 和 ReentrantLock 的区别

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

常见实用的锁策略详解

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

阻塞队列的使用

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

CountDownLatch类的使用

CountDownLatch是一种用来控制多线程的工具类,它被称为门阀、计数器或者闭锁.
原创
发布博客 2022.12.17 ·
7506 阅读 ·
25 点赞 ·
17 评论 ·
15 收藏

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

单例模式的创建(饿汉模式&懒汉模式)
原创
发布博客 2022.12.16 ·
7371 阅读 ·
14 点赞 ·
11 评论 ·
9 收藏

Volatile关键字的作用

volatile关键字的使用
原创
发布博客 2022.12.09 ·
6537 阅读 ·
14 点赞 ·
9 评论 ·
13 收藏

wait与notify的使用

wait与notify的使用
原创
发布博客 2022.12.06 ·
8109 阅读 ·
15 点赞 ·
12 评论 ·
13 收藏

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

Iterable、Collection、List 的常见方法签名以及含义
原创
发布博客 2022.07.03 ·
6368 阅读 ·
4 点赞 ·
3 评论 ·
4 收藏

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 ·
41441 阅读 ·
123 点赞 ·
14 评论 ·
580 收藏

文件操作详解(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 ·
6871 阅读 ·
25 点赞 ·
46 评论 ·
17 收藏

文件操作详解(1)

文件操作详解
原创
发布博客 2022.04.16 ·
7259 阅读 ·
28 点赞 ·
22 评论 ·
16 收藏

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

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
原创
发布博客 2022.04.13 ·
7791 阅读 ·
24 点赞 ·
24 评论 ·
13 收藏
加载更多