Java
文章平均质量分 93
yanzigejuly
这个作者很懒,什么都没留下…
展开
-
关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析
当我们在使用 ReentrantLock 进行加锁和解锁时,底层到底是如何帮助我们进行控制的啦?带着这样的疑问,我们先后跟进 lock()和unlock() 源码一探究竟。原创 2024-09-25 17:59:52 · 934 阅读 · 0 评论 -
记一次分布式锁失效的生产事故
在给某项目做业务开发的时候,有一个任务派发的定时任务,该定时任务通过算法,把系统源源不断的任务每隔一分钟派发给不同的审核员进行审核。因为考虑到分布式任务调度器(如:xxljob/elasticjob)需要单独服务器搭建服务,所以为了减少服务器成本,就自己基于现有资源编写分布式锁,因为现有redis环境,于是就基于redis编写分布式锁,来保证多个实例只有一台实例在同一个时间点在执行派发任务。原创 2024-09-25 17:32:03 · 825 阅读 · 0 评论 -
Mybatis Plus配置多数据源
该项目主要描述了Mybatis Plus多数据源的配置和使用,其中详细记录的配置过程,整个过程从数据库表的创建到数据初始化都有详细的记录说明。另外,如果存在同一个表在多个数据源中都存在的情况,有一些注意事项,下面看文章通过例子说明。原创 2024-08-07 18:30:28 · 7050 阅读 · 0 评论 -
记一次for update“同一事务”中update无法获取数据锁的解决
问题原因就在这,虽然测试环境实际上只有一个数据库,但是ShardingJDBC配置了主从,那么即使只有一个数据库,也会产生两条连接,一条用于主、一条用于从,所以在select for update语句的时候默认使用从库的链接的事务中获取数据,并且将数据加锁,而表面上看代码是同一事务的update时,实际上是使用主库的链接的事务进行更新数据,所以select 和 update不在同一个事务中,故代码层面看是同一事务的先后两个操作,update时实际获取不到之前的select的锁,所以发生等待直至超时报错。原创 2024-07-30 18:34:14 · 989 阅读 · 0 评论 -
各种集合、对象的对比记忆
同类型的StringBuilder和StringBuffer的实现原理一样,其父类都是AbstractStringBuilder。StringBuffer是线程安全的,StringBuilder是JDK 1.5新增的,其功能和StringBuffer类似,但是非线程安全。因此,在没有多线程问题的前提下,使用StringBuilder会取得更好的性能。String是不可变对象,每次对String类型进行操作都等同于产生了一个新的String对象,然后指向新的String对象。原创 2024-07-29 17:47:42 · 776 阅读 · 0 评论 -
Java的12个语法糖
前面介绍了12种Java中常用的语法糖。所谓语法糖就是提供给开发人员便于开发的一种语法而已。但是这种语法只有开发人员认识。要想被执行,需要进行解糖,即转成JVM认识的语法。当我们把语法糖解糖之后,你就会发现其实我们日常使用的这些方便的语法,其实都是一些其他更简单的语法构成的。有了这些语法糖,我们在日常开发的时候可以大大提升效率,但是同时也要避免过渡使用。使用之前最好了解下原理,避免掉坑。说明:本文转载自公众号 Hollis 的文章《原创 | 不了解这12个语法糖,别说你会Java!侵权删。转载 2024-07-27 11:36:39 · 89 阅读 · 0 评论 -
深入理解HashMap扩容机制(JDK7)
Hashmap的扩容需要满足两个条件:当前数据存储的数量(即size())大小必须大于等于阈值;当前加入的数据发生了hash冲突。因为上面这两个条件,所以存在下面这些情况就是hashmap在存值的时候(默认大小为16,负载因子0.75,阈值12),可能达到最后存满16个值的时候,再存入第17个值才会发生扩容现象,因为前16个值,每个值在底层数组中分别占据一个位置,并没有发生hash碰撞。当然也有可能存储更多值(超多16个值,最多可以存27个值)都还没有扩容。原创 2024-07-26 14:50:44 · 1873 阅读 · 0 评论
分享