0

0

Java里的AbstractQueuedSynchronizer核心变量state的作用_锁状态表示

P粉602998670

P粉602998670

发布时间:2026-03-06 08:51:12

|

246人浏览过

|

来源于php中文网

原创

state是aqs中唯一被volatile修饰的核心整型变量,其语义由子类通过tryacquire/tryrelease定义,必须用cas或setstate操作,不可裸赋值;state==0不恒等于无锁,具体含义取决于同步器实现。

java里的abstractqueuedsynchronizer核心变量state的作用_锁状态表示

state 是 AQS 里唯一被 volatile 修饰的核心整型变量,它不直接等于“锁是否被占用”,而是由具体同步器解释的**状态码**

你看到 ReentrantLock 用它记重入次数、Semaphore 用它记剩余许可数、CountDownLatch 用它记倒数值——说明 state 本身没有固定语义,只是个可原子操作的共享整数。它的意义完全取决于子类怎么实现 tryAcquiretryRelease

为什么必须用 compareAndSetState 修改 state,不能直接赋值?

因为 state 是多线程竞争的关键字段,直接 state = 1 会丢失更新、破坏原子性。AQS 所有状态变更都基于 CAS(如 compareAndSetState(0, 1))或带自旋的 acquire 流程。哪怕只是“设置为 0”,也得走 setState(0)(内部仍是 volatile 写),而不是裸赋值。

  • 错误写法:state = 0 —— 编译不过(state 是 private final int,且没提供 public setter)
  • 危险写法:setState(1) 在没校验前提下直接调用 —— 可能覆盖其他线程刚写入的合法值
  • 正确路径:总是通过 tryAcquire / tryRelease 回调间接控制,这些方法里再用 compareAndSetStategetState + CAS 循环

state == 0 一定表示无锁?不一定

这是最常被误解的一点。state == 0 只代表当前整数值为 0,不代表同步器处于“空闲”状态。比如:

Dreamhouse AI
Dreamhouse AI

AI室内设计,快速重新设计你的家,虚拟布置家具

下载
  • CountDownLatch 构造时传 3,初始 state == 3;减到 0 才表示放行 —— 此时 0 是终态,不是空闲态
  • ReentrantLock 非公平模式下,一个线程释放锁时设 state = 0,但下一刻可能立刻被另一个线程抢到并设为 1,中间没有“安全窗口”
  • Semaphore(0) 初始 state == 0,此时所有 acquire() 都会阻塞 —— 0 表示“无资源可用”,而非“无人持有”

子类读写 state 的三个硬约束

你自己写 AQS 子类时,绕不开这三条:

立即学习Java免费学习笔记(深入)”;

  • 所有读必须用 getState(),不能直接读字段(字段是 private
  • 所有写必须用 setState(int)compareAndSetState(int, int),不能裸赋值
  • tryAcquiretryRelease 必须是无锁逻辑(不能在其中加 synchronized 或调用阻塞方法),否则会死锁 AQS 内部队列机制

真正难的不是看懂 state 是什么,而是想清楚你的同步语义该怎么映射到这个整数上——比如要不要支持超时、是否允许多线程同时 release、state 归零后是否允许再次初始化。这些设计一旦定下来,就很难改。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

950

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

604

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

212

2025.08.29

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

75

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

743

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

375

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.21

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

4

2026.03.05

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.1万人学习

C# 教程
C# 教程

共94课时 | 10.7万人学习

Java 教程
Java 教程

共578课时 | 77.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号