自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【经验帖】脏读和不可重复读的概念及影响

脏读和不可重复读是数据库事务并发执行时可能出现的两种数据一致性问题,它们对数据的一致性和完整性有着显著的影响。

2024-09-19 09:39:29 388 7

原创 【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何

在同一个事务中,当你先更新一个实体,然后立即查询这个实体(或基于相同条件查询),你通常会看到更新后的结果,这是因为Hibernate等ORM框架的缓存机制以及事务内部操作的原子性。API)的隔离级别通过定义事务之间的可见性和相互影响程度,直接影响了在同一个事务或不同事务中执行的查询操作的结果。在Java语言中,特别是当你在使用JPA(如Hibernate)或Spring Data JPA等ORM(对象关系映射)框架时,对于事务内的数据修改和查询的行为是高度依赖于事务的隔离级别以及数据库本身的实现细节的。

2024-09-19 09:00:36 924 1

原创 JAVA 的excel数据批量导入解析 现在都用什么API工具 Apache POI 、EasyExcel 、easypoi有什么区别

对于大多数需要处理Excel数据批量导入的场景,如果数据量不是特别大,且对性能要求不是特别高,EasyPoi和EasyExcel都是不错的选择。它们都能提供简单易用的API,并且能够很好地满足Excel数据导入的需求。如果数据量非常大,或者对性能有极高要求,那么推荐使用EasyExcel,因为它在处理大量数据时具有更好的性能和更低的内存占用。POI、EasyExcel和EasyPoi。这些工具各有特点,适用于不同的场景和需求。在Java中,处理Excel数据批量导入解析时,常用的API工具有Apache。

2024-09-10 16:09:28 828 4

原创 【JAVA基础】StringUtils.isEmpty、StringUtils.isBlank()、Objects.isNull()三者区别

【代码】【JAVA基础】StringUtils.isEmpty、StringUtils.isBlank()、Objects.isNull()三者区别。

2024-09-06 18:07:08 284 2

原创 【VUE】Vue 项目基本开发结构介绍

🌹🌹期待您的关注 🌹🌹,让我们共同进步!在 Vue 开发中,了解 Vue 项目的基本结构是进行 Vue 开发的基础。通过合理组织项目目录和代码结构,可以提高开发效率,增强代码的可维护性和可扩展性。在实际开发中,可以根据项目的需求和规模进行适当的调整和扩展,以满足不同的开发场景。

2024-09-06 14:48:39 1473

原创 【VUE】Vue 组件详解

Vue 组件是构建强大和可维护应用的关键。通过理解组件的基础概念、掌握创建和注册组件的方法,以及利用 ref 和 defineExpose 等特性,可以更加高效地开发 Vue 应用。在实际开发中,根据项目的需求合理地组织和使用组件,将大大提高开发效率和代码质量。

2024-09-06 14:35:24 1153

原创 HTTP状态码介绍,带你了解请求响应全过程

Processing:服务器正在处理请求,但尚未完成处理。2xx状态码:👉表示成功响应,客户端请求已成功接收、理解并处理。1xx状态码:👉表示信息响应,客户端请求已被接收,继续处理。🤔 100 - Continue:客户端应继续其请求。Switching Protocols:服务器已经理解并接受了客户端的请求,将切换协议。

2024-09-06 12:58:34 287

原创 【JAVA高级】ReadWriteLock 读写锁

🌹🌹期待您的关注 🌹🌹,让我们共同进步!ReentrantReadWriteLock可重入读写锁是读写锁的唯一实现。多个线程同时读一个资源类没有任何问题,所以为了满足并发量,读取共享资源应该可以同时进行。但是,如果有一个线程想去写共享资源类,就不应该再有其他线程可以对该资源进行读或写。

2024-09-06 10:28:02 270

原创 【JAVA高级】Semaphore信号量的使用介绍

而Semaphore可以解决这个问题,比如6辆车3个停车位,对于CountDownLatch只能停3辆车,而Semaphore可以停6辆车,车位空出来后,其它车可以占有,这就涉及到了Semaphore.accquire()和Semaphore.release()方法。● acquire(获取) 当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),要么一直等下去,直到有线程释放信号量,或超时。信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。

2024-09-06 10:19:28 305

原创 【JAVA高级】并发同步工具CyclicBarrier 的使用介绍

CyclicBarrier 是 Java 中的另一个同步辅助类,它可以让一组线程互相等待,直到所有线程都达到一个屏障点后再继续执行。与CountDownLatch 不同的是,CyclicBarrier的计数器可以循环使用,当所有线程都到达屏障点后,计数器会重置,可以被复用。所谓 Cyclic 即循环的意思,所谓 Barrier即屏障的意思。所以综合起来,CyclicBarrier 指的就是循环屏障,虽然这个叫法很奇怪,但是却能很好地表达其含义。

2024-09-05 18:41:44 1213

原创 【多线程】方法中定义的局部变量是否为线程安全的?

如果有多个线程操作一个局部变量,这个局部变量此时也就是共享数据,这个局部变量可能是线程安全的,也可能是线程不安全的,怎么区分呢?在Java中,成员方法(也称为实例方法)中的局部变量本身并不直接涉及线程安全的问题,因为局部变量是存储在栈(stack)上的,每个线程调用方法时都会在栈上创建自己的局部变量副本。而有的局部变量是线程不安全的?然而,需要注意的是,局部变量本身虽然是线程安全的,但如果局部变量引用了非线程安全的对象(如共享资源),并且这些对象在多个线程中被修改,那么就会存在线程安全问题。

2024-09-05 15:11:00 268

原创 【多线程】线程池之exectue与submit的区别

背景:在日常进行多线程的开发过程中,遇见了有的线程池用excute提交子线程任务,有的使用submit提交线程任务。execute和submit都属于线程池的方法,那这两种有什么区别呢?我们一起来验证一下。

2024-09-04 10:01:37 479

原创 【Python】Python 读取Excel、DataFrame对比并选出差异数据,重新写入Excel

背景:我在2个系统下载出了两个Excel,现在通过对下载的2个Excel数据,并选出差异数据 从新写入一个新的Excel中。

2024-09-04 09:28:06 381

原创 【Python】Python 读取Excel、DataFrame对比并选出差异数据,重新写入Excel

背景:我在2个系统下载出了两个Excel,现在通过对下载的2个Excel数据,并选出差异数据 从新写入一个新的Excel中。

2024-09-04 09:21:13 523

原创 【多线程】CountDownLatch的简单实现

通过上一篇对CountDownLatch的使用,我们也明白了他的基本原理,接下来我们一起来实现一个CountDownLatch的基础效果。

2024-09-03 17:22:28 298

原创 【多线程】Java并发工具类之CountDownLatch 同步协作的利器

CountDownLatch用一个给定的计数器来初始化,该计数器的值表示需要等待完成的任务数量。当计数器的值达到零时,表示所有需要等待的任务都已经完成,此时在CountDownLatch上等待的线程将被唤醒并可以继续执行。● 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。CountDownLatch内部维护了一个计数器,只有当计数器==0时,某些线程才会停止阻塞,开始执行。

2024-09-03 14:41:34 1575 4

原创 【Git】IDEA代码合并|merge into

当然我这里是dev和test分支之间没有冲突的情况下,合并很顺利,如果出现了冲突,我们就和另外冲突的开发人员的代码进行比较,相互讨论确定出哪些需要要,哪些不需要,在本地的test中解决冲突合并之后后再push到远程test即可。第四步:进入页面,可以看到我们刚刚合并后的分支,在这里选择到需要review的管理人员,还有测试人员,都完成之后,由相应的人员点击下面的审查通过 和测试通过按钮,之后再点击。提交到远程的dev分支之后,我现在需要合并到test分支,去和其他的需求合并起来并部署到test环境。

2024-09-03 11:08:39 520

原创 【不安全的集合类】同步容器(ConcurrentHashMap)、并发集合(CopyOnWriteArrayList)

CopyOnWrite容器即写时复制的容器,往一个容器中添加元素的时候,不直接往当前容器Object[]添加,而是现将当前容器Object[]进行Copy,而是复制出一个新的容器Object[] newElements向新容器添加元素,添加之后,再将原容器的引用指向新的容器setArray(newElements);这里浅说一下HashSet的源码,HashSet其实就是一个HashMap,HashSet的中存的值是HashMap的key,HashMap中的Value是一个固定对象PRESENT。

2024-09-02 22:21:25 845

原创 【多线程】线程间通信 之虚假唤醒和中断

两个线程,可以操作初始值为0的一个变量,实现一个线程对该变量+1,一个线程对该变量-1,实现交替,来10轮,变量初始值为0,以实现此问题作为引入,简化我们的理解。

2024-09-02 17:39:38 757

原创 【多线程】并发编程wait和sleep的区别

wait():wait()方法必须在同步方法或同步代码块中调用,因为它要求调用线程必须拥有对象的锁。wait():调用wait()方法的线程会释放它持有的对象锁,并进入等待状态,直到其他线程调用该对象的notify()或notifyAll()方法来唤醒它。wait():wait()方法被调用后,可以通过其他线程调用该对象的notify()或notifyAll()方法来唤醒。sleep():sleep()方法睡眠指定时间之后,线程会自动苏醒,或者通过调用interrupt()方法提前打断睡眠。

2024-09-02 16:09:18 293

原创 【线程间通信】sleep/wait/notify/notifyAll作用及使用

wait和notify都要先获取到锁才能使用。获取到锁后,使用wait,线程会先释放锁对象,然后阻塞等待;使用notify,会通知在同一个锁对象上等待的线程,如果当前有多个线程在等待同一个锁对象,会随机唤醒一个等待的线程;而notifyAll,是所有线程都唤醒,这些线程再一起竞争锁。

2024-09-02 14:17:21 867

原创 【GIT】idea中实用的git操作,撤回commit,撤回push、暂存区使用

push之后发现本地和远程仓库的代码都没了,那不白写了真难受,不要急也有办法,此时还是在本地的commit记录中找到之前commit的记录,右键点击Cherry-pick即可恢复之前commit的代码。如果在第二个问题的操作之后,又想对刚刚去掉的代码进行恢复了,直接选中revert 的记录,点击再次revert commmit,也就是以当前为基础,按照第二个问题操作就行。点击后,没识别到修改的这行代码和文件。**步骤2:**见下图,本地没了之后,我们需要再把没了之后的代码先Commit,再push一下,

2024-08-28 15:07:28 1819

原创 【GIT】Idea中的git命令使用-全网最新详细(包括现象含义)

完成工作后,你可以将这个新分支合并回。**目的:**我现在想要在dev开发分支开发的内容合并到test分支,因此 我在dev分支修改代码,增加了一行 ,来模拟自己在dev新增的代码,这个代码要合并到test分支上;好了,常用命令这就梳理的差不多了,当然也可以通过IDEA的ui页面直接操作也是可以的,原理步骤顺序都是类似,的,理解了上面的步骤,通过UI操作也恒轻松了~现象:是因为你当前就在dev分支,所以无法删除当前分支,如果你想删除dev分支,你需要先跳转到别的分支,然后再去删除这个分支之外的其他分支;

2024-08-28 11:21:17 1247

原创 【线程安全】ReentrantLock和synchronized的使用示例——言简意赅

三个进货员 分别进货 500000次、50000、50000次,一共应该进来600000箱;* 笔记:如何编写企业级的多线程代码 *其中应用到了Lambda表达式,表达式未简化之前样式可见上面注释代码。固定的变成套路+模板是什么?

2024-08-27 18:08:27 381

原创 【面经】synchronized关键字的底层原理

synchronized 修饰方法,并没有 monitorenter 指令和 monitorexit 指令,取得代之的是 ACC_SYNCHRONIZED 标识,该标识指明了该方法是一个同步方法,JVM 通过该 ACC_SYNCHRONIZED 访问标志来辨别一个方法是否声明为同步方法,从而执行相应的同步调用。对象的对象头中,synchronized 锁便是通过这种方式获取锁的,这也是为什么 Java 中任意对象都可以作为锁的原因)当计数器为0,则可以成功获取,获取后将锁计数器设为1,也就是加1;

2024-08-27 16:40:50 223

原创 线程安全性分析 及 成员变量、实例变量、局部变量、类变量的区别及存储

静态变量前要加static关键字,而实例变量前则不加。

2024-08-27 10:27:30 1677

原创 【流式编程】Stream.of()用法解析及使用示例

Stream.of() 方法可以接受任意数量的参数,这些参数将作为流中的元素。你可以传递任意类型的参数给这个方法,只要所有参数的类型相同,或者它们之间存在适当的自动装箱/拆箱关系。在这个示例中,我们首先使用 Stream.of() 创建一个整数流,然后使用 filter() 方法过滤出偶数,最后使用 sum() 方法计算这些偶数的和。这个示例创建了一个包含四个字符串的流,并使用 forEach 方法打印出流中的每个元素。中的一个静态方法,用于从给定的元素创建一个顺序流(Sequential。

2024-08-26 17:55:25 543

原创 【JAVA流编程】Arrays.stream(T[] array) 用法

使用流,你可以进行复杂的查询/过滤操作、映射转换、归约等操作,而这一切都可以以声明式的方式完成,代码更加简洁、易于理解。假设你有一个整型数组,你想要找出其中所有的偶数,并计算它们的和。Arrays.stream() 函数可以将数组转换为流,使用流API可以更简洁的处理数组中的数据,在大量数据的情况下可以提高性能。使用 Arrays.stream() 方法可以将数组转换为流,然后就可以对数组中的元素进行各种操作,例如过滤,映射,排序等。引入的一个非常有用的方法,它允许你以流(Stream)的形式处理数组。

2024-08-26 17:47:58 158

原创 【Java并发】变量的内存存储、线程安全分析

也就意味着不同作用域的局部变量是不共享的。UserDaoImpl中的update方法中的 conn 是局部变量,并且没有逃离方法的作用范围,所以 conn是线程安全的,UserServiceImpl 中的 UserDao是成员变量,但是userDao它调用的方法是线程安全的,所以userDao也是线程安全的,同理,userService也是线程安全的。conn是成员变量,多个线程用的是同一个conn,所以是线程不安全的,同时 userDao 也是线程不安全的,userService也是线程不安全的。

2024-08-26 17:41:16 902

原创 什么变量需要去考虑多线程之间的线程安全问题

总之,在多线程编程中,任何可能被多个线程访问和修改的共享变量都需要考虑线程安全问题。通过合理的设计和使用同步机制,可以有效地避免线程安全问题,保证程序的正确性和稳定性。在多线程编程中,线程安全问题主要发生在多个线程访问并修改同一份共享资源时。

2024-08-26 11:04:41 191

原创 【工具使用】 idea中从当前分支创建新分支之后,更新提示 cat not update 分支名称 has not tracked branch

首先在IDEA中你想要从哪个分支进行创建新分支,需要先切换到到这个分支,比如我先切换到dev分支,并点击右键,New Branch from Selected…这个选项,之后会出现一个弹框,让你输入自己的 新分支点名称 ,这里我叫做 feature-index-20240701。这是因为你在IDEA中创建的新分支还没有推送到远程的仓库,如果你点击pull的话,也不知道从远程的哪个仓库进行拉取,所以会提示这个错误;背景:我需要从dev分支拉取一个新的分支,在这个新分支上进行某个特定需求的开发;

2024-08-23 12:56:51 424

原创 深入解析 `CopyOnWriteArrayList` 的实现原理与应用

1、由于写操作的时候,需要拷贝数组,会消耗内存,如果原数组的内容比较多的情况下,可能导致young gc或者full gc。(1、young gc :年轻代(Young Generation):对象被创建时,内存的分配首先发生在年轻代(大对象可以直接被创建在年老代),大部分的对象在创建后很快就不再使用,因此很快变得不可达,于是被年轻代的GC机制清理掉(IBM的研究表明,98%的对象都是很快消亡的),这个GC机制被称为Minor GC或叫Young GC。特别是在数组较大时,写操作的性能会受到较大影响。

2024-08-21 15:01:32 774

原创 CommandLineRunner

在这个方法中,你可以访问传入的命令行参数(尽管这在实践中可能不常见,因为通常 Spring Boot 的配置文件已经提供了所有必要的配置),并执行所需的启动逻辑。在这个例子中,MyCommandLineRunner 类通过 @Component 注解被 Spring 容器管理,这意呀着当 Spring Boot 应用程序启动时,Spring 会自动找到这个类并调用其 run 方法。CommandLineRunner 提供了在应用启动时执行代码的能力,但过度使用可能会导致应用启动时间变长,从而影响用户体验。

2024-08-20 15:40:11 342

原创 【微服务】微服务组件之Nacos注册中心和配置中心的使用

Service)是阿里巴巴开源的一个动态服务发现和配置管理平台,专为微服务架构和云原生应用设计。它旨在简化服务注册、配置管理和服务治理的复杂性,通过提供一套简单易用的特性集,帮助开发者快速构建、部署和管理微服务应用。

2024-08-20 09:32:57 1427

原创 Controller中接收数组参数 post请求中在body中传+post请求中通过表单形式传(x-www-form-urlencoded)

需要根据用户id集合批量删除用户数据,前端使用post请求,controller中参数接收数组参数并根据用户id删除用户基本信息。请求体中为json字符串,后端新建一个UserDTO(用户数据传输类),用于接收前端json参数。需要注意的是,上图中不是选择的form-data (这是get请求通过表单形式提交应该选择的)

2024-08-19 15:01:10 1267

原创 GitLab Merge Request流水线

reviewer打开链接,点击changes,review相关改动的code,如果没什么问题就返回overview,提交者在自己的分支改完代码上传之后,merge request会自动更新,提交者@审核者再去查看改动,直至通过。2.后续在各自的分支上开发提交,当自己的需求模块开发完毕,要合并入dev分支时,需要去gitlab上创建Merge Request。ps:下次要创建merge之前,记得合并dev分支的代码到自己的分支,类似之前git代码推之前先拉取一下。审核通过,代码会合并入对应的分支。

2024-08-19 14:34:44 308

转载 springboot 对于@Autowired 注入为null 的介绍与解决方式

(2)你的这个类有被new出来的实例的,new 过的对象不会交给Spring容器管理 所以里面的 service或者dao注入不进来。一般是指引用某些框架,你是继承某个接口,但是这些框架默认new过这个方法,比如MVC拦截的HandlerInterceptor类。(1)比如我想在某个类实现RedisUtils 类的注入,但是用@autowired 会报null。对于(1)其实就加入@Component 就可以了。(1)该类没有托管给spring 管理,一般在类的上面添加@Component。

2024-08-16 14:35:36 258

转载 Stream之flatMap

目标:将如下对象中的分类category提取出来,去重。其中如"哲学,爱情",需要解析为两个分类,[“哲学”,“爱情”]flatMap:将小Stream转换为大Stream。

2024-08-16 11:18:58 167

转载 Java Stream通过findFirst()查找满足条件的一条数据

findFirst是短路终端操作(short-circuiting terminal operation),流操作是一组中间操作和终端操作,如果中间操作可以为无限输入生成有限流,则它是短路(short-circuiting)。示例2:下面是使用IntStream、LongStream和DoubleStream的findFirst方法的示例。如果findFirst选择的元素为null,它将抛出NullPointerException。回:findFirst方法返回Optional包含流中第一个元素的元素。

2024-08-16 11:08:20 176

原创 【RestTemplate 】RestTemplate postForObject使用+如何创建一个配置为忽略 SSL 证书和主机名验证的 RestTemplate 实例

紧急修复或绕过:在极少数情况下,如果生产环境中的SSL/TLS配置出现问题,导致正常业务受到严重影响,而快速修复不可行时,可能会考虑临时忽略SSL证书验证以恢复服务。然而,这应被视为最后的手段,并且应立即着手解决根本问题。内部网络或受信任的网络:如果你的应用程序在内部网络或你完全控制并信任的网络中运行,那么可能不需要通过标准的SSL/TLS验证来确保安全性。教育和学习目的:在学习或教授网络编程和安全性时,为了帮助学生或开发者理解SSL/TLS的工作原理和重要性,可能会故意配置忽略SSL证书验证的环境。

2024-08-16 10:58:15 402

空空如也

空空如也

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

TA关注的人

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