【SpringBoot篇】解决Redis分布式锁的 误删问题 和 原子性问题
import org.redisson.Redisson;
import org.redisson.api.RAtomicLong;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
public class RedissonAtomicLongExample {
public static void main(String[] args) {
// 配置RedissonClient
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);
// 获取原子长整型对象
RAtomicLong atomicLong = redisson.getAtomicLong("myAtomicLong");
// 设置初始值
atomicLong.set(0);
// 模拟多线程并发操作
for (int i = 0; i < 10; i++) {
new Thread(() -> {
while (true) {
long currentValue = atomicLong.get();
if (currentValue >= 10) {
break; // 停止增加
}
// 使用compareAndSet方法保证操作的原子性
if (atomicLong.compareAndSet(currentValue, currentValue + 1)) {
System.out.println("Updated value to: " + (currentValue + 1));
}
}
}).start();
}
// 关闭Redisson客户端
redisson.shutdown();
}
}
这段代码使用Redisson提供的RAtomicLong类来解决原子性问题,确保即使在多线程环境下,变量的增加操作也是原子性的。它使用compareAndSet
方法来比较并设置值,这个方法保证了即使在高并发情况下也不会出现超卖的情况。此外,它使用了get
方法来获取当前值,然后在compareAndSet
方法中使用这个值来尝试更新,如果更新成功则退出循环,否则继续尝试。这样可以避免误删问题,因为它只有在确定没有其他线程修改值之后才会进行更新操作。
评论已关闭