关于 refreshLocalSeqId 方法是否存在并发问题?

来源:4-22 分布式id生成器-无序id的生成

慕少4057723

2024-02-02

refreshLocalSeqId代码中
假设两个线程 (线程1 和 线程2)都执行到这个if 判断 ,并且结果都为true
if (localSeqIdBO.getCurrentNum().get() - localSeqIdBO.getCurrentStart() > step * UPDATE_RATE) {

然后程序按照如下顺序进行执行代码:

线程1 先执行 semaphore.tryAcquire()
异步开启线程3 去异步占用id段
线程3 执行semaphore.release
线程2 又会去执行 semaphore.tryAcquire()
此后又会异步异步占用id段

这样是否还是会出现会连续占用两次id 段的问题呢 ?

写回答

1回答

Danny_Idea

2024-02-03

不会,底层数据库那块还做了一个乐观锁

0
1
慕少4057723
抱歉没有理解,老师我再理一下整个过程哈: 1. 线程1 和 线程2 都执行getSeqId操作,当它们执行如下 if 都为true if (localSeqIdBO.getCurrentNum().get() - localSeqIdBO.getCurrentStart() > step * UPDATE_RATE) 2.线程1 先执行 semaphore.tryAcquire() ----异步开启线程3 执行 selectById 和 tryUpdateMySQLRecord 去异步占用id段 成功 满足乐观锁条件version=#{version} ----线程3 执行semaphore.release 3.因为前面锁已经是否了,此时线程2 又会去执行 semaphore.tryAcquire() 成功 ----异步开启线程4 执行 selectById 和 tryUpdateMySQLRecord 去异步占用id段 成功 满足乐观锁条件version=#{version} ----线程4 执行semaphore.release 感觉还是会出现 线程2生成的线程4会占用新号段成功
2024-02-03
共1条回复

SpringCloudAlibaba高并发仿斗鱼直播平台实战

SpringCloudAlibaba高并发仿斗鱼直播平台实战

421 学习 · 344 问题

查看课程