跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

Java Lock Condition 多路条件变量示例

综述由AI生成Java 锁机制中 Lock 接口支持多路 Condition 实现更灵活的线程通信。通过 ReentrantLock 创建多个 Condition 对象,分别处理队列满和队列空的状态。代码展示了有界缓冲区实现,put 方法在队列满时等待 notFull 条件,取数据后唤醒 notEmpty;take 方法在队列空时等待 notEmpty,取数据后唤醒 notFull。相比 synchronized 只能配合单一 wait/notify,Lock 的多路 Condition 允许针对不同状态精确控制线程唤醒,提升并发效率。

CodeArtist发布于 2016/4/1更新于 2026/6/922 浏览
Java Lock Condition 多路条件变量示例

简介

Lock 接口的作用类似于 synchronized,但提供了更灵活的控制方式。使用 synchronized 时,等待和唤醒依赖于 Object 的 await() 和 notify() 方法;而使用 Lock 时,则通过 Condition 对象的 await() 和 signal() 方法实现。

Lock 与 synchronized 的主要区别在于,Lock 支持创建多个 Condition 实例,从而实现多路条件等待,而 synchronized 仅能配合单一的 monitor 对象。

示例

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 阻塞队列
 * 采用多路 Condition
 */
public class BoundedBuffer {

	/**锁*/
	final Lock lock = new ReentrantLock();
	
	/**未满条件*/
	final Condition notFull = lock.newCondition();
	/**非空条件*/
	final Condition notEmpty = lock.newCondition();
	
	/**阻塞队列数组对象*/
	final Object[] items = new Object[100];
	
	/**存放下标、取出下标和当前队列元素个数*/
	int putIndex , takeIndex, count;
	
	public void put(Object element) throws Exception {
		lock.lock();
		try {
			while(count == items.length){ //队列已满
				notFull.await(); //队列满等待
			}
			//存放数据
			items[putIndex] = element;
			 (++putIndex == items.length){
				putIndex = ;
			}
			count ++;
			
			
			notEmpty.signal();
		}  {
			lock.unlock();
		}
	}
	
	 Object   Exception {
		lock.lock();
		   ;
		 {
			(count == ) { 
				notEmpty.await(); 
			}
			
			value = items[takeIndex];
			 (++takeIndex == items.length) {
				takeIndex = ;
			}
			count --;
			
			
			notFull.signal();
			
			 value;
		}  {
			lock.unlock();
		}
	}
	
}
if
0
//唤醒空等待
finally
public
take
()
throws
Object
value
=
null
try
while
0
//队列为空
//队列空等待
//取出数据
if
0
//唤醒满等待
return
finally

目录

  1. 简介
  2. 示例
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Spring Boot 与 Vue 实现 WebSocket 实时匹配系统
  • Qwen2.5-72B-GPTQ-Int4 实战:vLLM 推理与 Chainlit 可视化集成
  • 深入剖析 Git 原理与使用(上):核心架构与基础操作
  • 字节跳动开源 Seed-OSS-36B:512K 上下文与推理控制
  • Pi0 机器人 VLA 大模型昇腾 A2 平台测评报告
  • Spring AI:Java 生态的 AI 赋能与企业级应用实践
  • 我国网络安全人才市场供需趋势与特征分析
  • Spring Boot 全局异常处理与日志监控实战
  • Whisper 模型国内镜像源汇总与快速下载指南
  • ChatGPT 免费版与微软 Copilot 技术选型对比
  • Java 面试题及答案汇总(基础、容器、多线程等)
  • Python 入门高效编程技巧指南
  • 基于改进 YOLOv11n 的无人机红外目标检测算法
  • C++ 基于正倒排索引的搜索引擎 Searcher 模块详解
  • 医疗 AI 场景下的模型融合与集成策略
  • JS 逆向断点调试与前端加密对抗及企业 SRC 实战案例
  • 容器适配器深度解析:STL 中的 stack、queue 与优先队列底层实现
  • Vue 组件 Prop 验证与枚举值最佳实践
  • Linux 文件存储结构原理:从 dentry 到 inode 再到硬链接
  • OpenClaw 龙虾图鉴:16 款 AI Agent 选型指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online