如何利用基本类型布尔变量的赋值原子性编写无锁轻量限流

夏婷酱_2476

夏婷酱_2476

2026-06-02

215人浏览

原创

可行但仅适用于一次性开关式限流,本质是利用volatile boolean写入的原子性实现状态抢占,不支持速率控制、重置窗口或计数功能。

如何利用基本类型布尔变量的赋值原子性编写无锁轻量限流

直接用 boolean 类型的赋值操作实现无锁限流,是可行的,但仅适用于极轻量、低精度、单次触发类场景(比如“只允许第一个请求通过,其余全部拒绝”)。它的本质不是“控制速率”,而是利用布尔变量写入的原子性做一次性的状态抢占。

为什么 boolean 赋值能算“原子”

在 Java 和大多数主流 JVM 实现中,对 volatile boolean 的写入(如 flag = true)是原子的——不会出现“半写入”或“撕裂”现象。这不是语言规范强制保证(JLS 只明确保证 64 位以下读写在没有 volatile 时可能非原子),但实际运行时,只要声明为 volatile,JVM 就会插入内存屏障并确保底层指令原子执行。关键点在于:

  • 普通 boolean flag = false; 不保证线程间可见性,也不能依赖其原子性
  • volatile boolean flag = false; 才具备:写入原子 + 对所有线程立即可见
  • 它不支持“读-改-写”复合操作(比如 if (!flag) flag = true; 仍存在竞态),所以不能直接用于计数或重置逻辑

适用场景:一次性开关式限流

典型例子是“首请求放行,后续拦截”——例如初始化配置加载、首次健康检查上报、防重复提交的令牌发放等。这类需求不要求 QPS 控制,只要求严格一次成功。代码结构简洁:

private static volatile boolean hasPassed = false;

public boolean tryAcquireOnce() {
    if (!hasPassed) {
        hasPassed = true; // 原子写入
        return true;
    }
    return false;
}

注意:上面的 if (!hasPassed) 本身不是原子判断,但在高并发下,多个线程可能同时读到 false,然后都执行 hasPassed = true。由于写入是原子且幂等的,最终结果仍是只有一个线程拿到 true 返回值(其余线程在写入前已读取旧值,返回 false),逻辑正确。

Java Maven Secondary Analysis
Java Maven Secondary Analysis

分析ZIP压缩包或GitLab仓库中的Java Maven项目,确定二次开发范围、类数量、模块分布及生产相关指标。

下载

不能做什么:别误当 RateLimiter 用

以下常见误解需避免:

  • ❌ 试图靠反复设 flag = false 来“重置限流窗口”——没有时间维度和计数能力,无法实现滑动窗口或令牌桶
  • ❌ 在循环中轮询 while (!hasPassed) { ... } ——这是忙等,浪费 CPU,且不解决并发竞争本质
  • ❌ 混合使用非 volatile boolean 或局部变量——失去跨线程可见性和原子保障
  • ❌ 期望它支持“每秒最多 10 次”——必须引入计数器(推荐 AtomicInteger)或时间戳(配合 AtomicLong)

更进一步:用 volatile boolean 搭配原子计数器做简易令牌桶

如果需要基础的周期性放行(比如“每 10 秒最多 1 次”),可组合使用:

  • 一个 volatile long lastGrantTime 记录上次放行时间
  • 一个 AtomicInteger availableTokens 管理当前可用令牌
  • 每次请求先检查时间是否过期,再用 compareAndSet 扣减令牌

此时 volatile boolean 不再是主角,而是退为状态标志(如 isBucketActive),真正承担限流逻辑的是原子整数与时间判断。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9957

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7102

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6252

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1084

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

888

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1316

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2609

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19951

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1175

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习