跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava算法

Java Lock Condition 多路条件变量示例

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

CodeArtist发布于 2016/4/1更新于 2026/4/231 浏览
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;
			if (++putIndex == items.length){
				putIndex = 0;
			}
			count ++;
			
			//唤醒空等待
			notEmpty.signal();
		} finally {
			lock.unlock();
		}
	}
	
	public Object take() throws Exception {
		lock.lock();
		Object value = null;
		try {
			while(count == 0) { //队列为空
				notEmpty.await(); //队列空等待
			}
			//取出数据
			value = items[takeIndex];
			if (++takeIndex == items.length) {
				takeIndex = 0;
			}
			count --;
			
			//唤醒满等待
			notFull.signal();
			
			return value;
		} finally {
			lock.unlock();
		}
	}
	
}

目录

  1. 简介
  2. 示例
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 大语言模型应用指南:Gorilla
  • 程序员如何入局 AI 大模型及职业发展路径
  • 提升 SQL 技能的 7 个最佳练习平台
  • 基于SpringBoot的网上租赁系统设计与实现
  • Java 企业人事工资管理系统设计与实现
  • Linux LVM 磁盘管理工具详解:物理卷、卷组与逻辑卷操作
  • 软件设计各个模块分析
  • 交换瓶子问题 Java 最小交换次数解法
  • Java Cookie 技术原理与应用
  • CopyOnWriteArrayList 源码解析
  • Python 学习后如何找工作及就业方向分析
  • Windows 环境下如何将本地代码推送到 Git 远程仓库
  • Vue 中使用 Less 样式预处理
  • 大语言模型框架-Megatron-LM 源码分析
  • CSS 子元素选择器
  • Webpack Loader 一览表
  • ThinkPHP 5.1 环境安装与配置指南
  • Ubuntu SSH 服务安装与配置详解
  • 云原生容器技术入门:Docker 与 K8s 基本原理及用途
  • CSS 常用标签与属性详解

相关免费在线工具

  • 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

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online