- 博客(5)
- 收藏
- 关注
原创 并发情况操作同一集合引起的数组下标越界问题
扩容这个操作也完全没有加锁,这意味着,同一个数组,A线程想扩容10个,B现成想扩容5个,在复制元素的过程中,size没有更新,导致扩容这个操作在多个线程中可以相互覆盖。最后扩容了10个、5个就不一定了。复制数组的方法是把要添加的数组从最后一个元素之后的位置添加进去,要复制的长度就是我们addall的集合的大小,但实际扩容了多少不确定,如果扩少了,向指定下标的数组填值时,那就会越界。很简单,核心就四步,先把要添加的集合转成数组,然后把原始数组扩容,接下来是复制元素,最后再更新集合size的属性。
2024-01-23 15:59:56 378 1
原创 spring定时任务@Schedules注解的一些使用注意事项(逐步更新)
或者,如果你线程池最大线程数设的比较大,也可能在一个时刻产生超多的对象。我这里建议是分小批次,一次100,并且创建的任务重不要把全部字段都查出来,可以先查出id,任务开始时再用id去查需要的字段。添加@Schedules的类不要设置成多例,即@Scope("prototype"),添加了Schedules注解的类会被相关的spring切面接管,而无法被回收。定时任务设置的时间既要避开客户使用高峰期,也要考虑避开夜间的上线时间段,我就遇到过周日凌晨上线,结果服务因为一些原因没起来,导致定时任务没触发的问题。
2023-12-25 17:04:04 474
原创 sql使用in操作替代位运算
枚举类型的字段,如果想支持多选,大家往往会把枚举值设为1、2、4、8、16等,就是2的n次方。(这种存储方式应该有个专有名词的,我给忘了,三年前我还记得,越来越回旋了,知道的麻烦在评论区告诉我一下)。比如这样一个二进制数:00011111,它就表示16+8+4+2+1=31,也就是说,如果我想要状态是2的所有数据,那我倒数第二位是1就行了,它就表示我枚举状态的组合。使用in的话,就需要列举出来查询枚举的所有组合,这是个排列组合,当枚举中的值比较多时,这个组合也会增多,所以写死值不是很合适。
2023-12-21 17:37:49 1043
原创 线上大数据量插入主键冲突问题
集团原本针对16位oid有多实例的解决办法,是基于rabbitmq的实现,但此时,领域已按照集团要求完成了去rabbitmq改造,也就是说这条路已走不通了,需要我们自行解决这个问题。领域云和公有云使用的是同一个库,所以领导担心一但开启了19位雪花算法oid,仍在使用领域云的客户,尤其是有他们自己的erp系统的客户他们对接的接口会受到影响(Interger最大为16位,如果我们突然把id改成19位,对方接收后会失去精度)。,其他部门使用插入数据时,他们使用oid生成工具生成了19位id插入进来的。
2023-12-21 16:18:20 1266
原创 线程池嵌套使用引起的死锁问题
假设线程池最大线程数为4,那么当主线程的代码创建4个以上任务后,每个任务又想去向该线程池内添加任务,内层调用的线程池就只能将任务放进等待队列中。此时,由于使用了CountDownLatch,主线程代码在等待它创建的任务执行完毕,这些任务本身创建的新任务又在等待核心线程中的任务执行完毕而一直等待,进而产生循环等待,即线程池死锁。这导致该线程池彻底不可用,任何使用该线程池的代码均会超时。推测是线程池嵌套后,最大线程全部被未结束的主线程创建的任务占用,内层任务进了等待队列一直无法执行,进而导致的任务阻塞问题。
2023-12-21 15:29:41 857 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人