Java Lock Condition 总结

前言


 相关系列

  • 《Java & Lock & 目录》(持续更新)
  • 《Java & Lock & Condition & 源码》(学习过程/多有漏误/仅作参考/不再更新)
  • 《Java & Lock & Condition & 总结》(学习总结/最新最准/持续更新)
  • 《Java & Lock & Condition & 问题》(学习解答/持续更新)
     

 涉及内容

  • 《Java & Lock & 总结》
  • 《Java & Lock & AQS & 总结》
  • 《Java & Lock & ReentrantLock & 总结》
     
     

概述


 简介

    Condition @ 条件接口被设计用于定义条件机制。条件机制的本质是线程管理机制,用于在并发环境下对线程进行有序协调/精确控制,即令线程有序的等待/唤醒。对于条件机制我们可能并不陌生,原因是我们熟悉的ReentrantLock @ 可重入锁类及ReentrantReadWriteLock @ 可重入读写锁类中便存在条件机制,并且其还为这些具有独占特性的经典Lock @ 锁接口实现类提供了暂时解除独占的能力。这具体表现为我们可以通过锁接口定义的newCondition()方法获取条件接口对象,并通过该条件接口对象令已独占持有锁的线程暂时解除独占且管理至其重新恢复独占为止。而正因为我们通常会在可重入锁类/可重入读写锁类中比条件接口更早的接触到条件机制,并又在频繁使用的过程中对其“条件机制”的功能烂熟于心,从而导致许多开发者在无意间对条件机制的理解产生了错误,即直接将可重入锁类/可重入读写锁类这种提供暂时解除独占能力的条件机制视作条件机制本身,并进而将之与JVM层面synchronized关键字的wait/notify(等待/通知)机制进行对比,原因是等待/通知机制同样提供了暂时解除独占的能力。

    为什么说这种理解是错误的呢?原因是仅提供令线程等待/唤醒基本功能定义的条件接口/条件机制是不含任何逻辑性/目的性的。线程具体会出于什么原因/条件/目的,又是以什么方式等待/唤醒这些都由条件接口的实现类具体决定。故而可重入锁类/可重入读写锁类这种提供暂时解除独占能力的条件机制本质上只是对条件机制定义的一种实现,并无法全权代表条件机制定义本身。因此真正可以与等待/通知机制进行对比的条件机制也仅限于可重入锁类/可重入读写锁类的条件机制实现,因为只要存在相应需求/意愿,开发者完全可以基于自身设计构造一套截然不同的条件机制实现。

    条件接口只有ConditionObject @ 条件对象一个实现类。条件接口在Java JDK中有且仅有条件对象类一个实现类,该类以内部类的形式存在于AQS类中,并基于AQS类的作用/结构/逻辑构建出一套用于对暂时解除同步的AQS访问线程进行管理的条件机制实现,该知识点会在AQS类/条件对象类的相应文章中详述。条件对象类的条件机制实现非常重要,因为AQS类是经典锁接口实现类的通用底层实现,因此各个经典锁接口实现类的条件机制实际上都是基于AQS类的条件机制而实现的,或者更准确的说包含可重入锁类/可重入读写锁类在内的经典锁接口实现类的条件机制实现实际上都是AQS类的条件机制实现。
 
 

方法


 等待

  • void await() throws InterruptedException —— 等待 —— 令当前线程在当前条件中进入等待状态。该方法是等待方法“阻塞”形式的实现,当前线程会无限等待至因为信号而唤醒为止。当前线程在进入方法/等待持有期间如果已/被中断会抛出中断异常,但中断状态会被清除。

  • void awaitUninterruptibly() —— 等待(不可中断) —— 令当前线程在当前条件中进入等待状态。该方法是等待方法“阻塞不可中断”形式的实现,当前线程会无限等待至因为信号而唤醒为止。当前线程在进入方法/等待持有期间如果已/被中断不会抛出中断异常,但中断状态会被保留。

  • boolean await(long time, TimeUnit unit) throws InterruptedException —— 等待 —— 令当前线程在当前条件中进入等待状态。该方法是等待方法“超时”形式的实现之一,当前线程会有限等待至因为信号而唤醒为止并返回true,超时指定等待时间则返回false。当前线程在进入方法/等待持有期间如果已/被中断会抛出中断异常,但中断状态会被清除。

  • long awaitNanos(long nanosTimeout) throws InterruptedException —— 等待纳秒 —— 令当前线程在当前条件中进入等待状态。该方法是等待方法“超时”形式的实现之一,当前线程会有限等待至因为信号而唤醒为止并返回剩余等待纳秒,超时指定等待时间则返回0或负数。当前线程在进入方法/等待持有期间如果已/被中断会抛出中断异常,但中断状态会被清除。

  • boolean awaitUntil(Date deadline) throws InterruptedException —— 等待单位 —— 令当前线程在当前条件中进入等待状态。该方法是等待方法“超时”形式的实现之一,当前线程会有限等待至因为信号而唤醒为止并返回true,超时指定等待时间则返回false。当前线程在进入方法/等待持有期间如果已/被中断会抛出中断异常,但中断状态会被清除。
     

 信号

  • void signal() —— 信号 —— 唤醒一条在当前条件中等待的线程。

  • void signalAll() —— 信号全部 —— 唤醒所有在当前条件中等待的线程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S测试pod内存和CPU资源不足

只设置requests参数 mysql主从pod启动后监控 读压测之后 同时设置limits和requests,只调低内存值 监控 压力测试 同时设置limits和requests,只调低CPU值 初始状态 开始压测 结论 对于CPU,如果pod中服务使用CPU超过设置的limits&…

谷歌云GCP基础概念讲解

概览 云的基础是虚拟化:服务器,存储,网络。服务器是远程计算机的逻辑分区。存储是物理硬盘的逻辑划分。网络则是虚拟私有云。 谷歌是唯一一个拥有全球私有基础设施的公司;他们的谷歌云基础设施没有任何一部分通过公共互联网。换句…

绿盟科技发布三季度报告,收入略增,亏损收窄,经营性净现金流同比翻倍

10月30日,绿盟科技发布2024年三季度报告。2024年公司前三季度实现营业收入12.74亿元,同比增长5.57%;毛利率59.50%,同比增长4.76个百分点;期间费用总额同比下降7.68%;公司实现归属于上市公司股东的净利润-3.…

【云原生】云原生后端详解:架构与实践

目录 引言一、云原生后端的核心概念1.1 微服务架构1.2 容器化1.3 可编排性1.4 弹性和可伸缩性 二、云原生后端的架构示意图三、云原生后端的最佳实践3.1 使用服务网格3.2 监控与日志管理3.3 CI/CD 流水线3.4 安全性 总结参考资料 引言 随着云计算的迅猛发展,云原生…

Python 爬虫的寻宝大冒险:如何捕获 API 数据的宝藏

在这个信息爆炸的数字时代,数据就像是隐藏在网络深处的宝藏,等待着勇敢的探险家去发现。今天,我们要讲述的是如何成为一名 Python 爬虫探险家,装备你的代码工具,深入 API 的迷宫,捕获那些珍贵的数据宝藏。 …

C++-类与对象总结

const函数声明 1. 修饰成员函数,不会改变成员变量: - a function b const (c){}: in member function means, all member properties in the function cannot be modified. 2.修饰形参,输入参数在函数中不会被更改,提高程序的…

《近似线性可分支持向量机的原理推导》 拉格朗日函数 公式解析

本文是将文章《近似线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析,便于初学者更好的理解。 公式 9-41 解释: L ( w , b , ξ , α , μ ) 1 2 ∥ w ∥ 2 C ∑ i 1 N ξ i − ∑ i 1 N α i ( y i ( w T x i b ) − ( 1 − ξ …

【云原生】云原生后端:安全性最佳实践

目录 引言一、身份管理1.1 身份验证1.2 身份授权 二、数据加密2.1 数据静态加密2.2 数据传输加密2.3 密钥管理 三、网络安全3.1 网络隔离3.2 防火墙与入侵检测3.3 安全组与网络访问控制列表 (NACL) 结论 引言 在云原生架构中,安全性是一个至关重要的考量。随着应用…

C++,STL 051(24.10.28)

内容 1.map容器的构造函数。 2.map容器的赋值操作。 运行代码 #include <iostream> #include <map>using namespace std;void printMap(map<int, int> &m) {for (map<int, int>::iterator it m.begin(); it ! m.end(); it){cout << &quo…

《链表篇》---环形链表II(返回节点)

题目传送门 方法一&#xff1a;哈希表&#xff08;与环形链表类似&#xff09; 很容易就可以找到链表的相交位置。 public class Solution {public ListNode detectCycle(ListNode head) {if(head null || head.next null){return null;}Set<ListNode> visited new Ha…

从0开始深度学习(17)——数值稳定性和模型初始化

在每次训练之前&#xff0c;都会对模型的参数进行初始化&#xff0c;初始化方案的选择在神经网络学习中起着举足轻重的作用&#xff0c; 它对保持数值稳定性至关重要。 我们选择哪个函数以及如何初始化参数可以决定优化算法收敛的速度有多快。 糟糕选择可能会导致我们在训练时遇…

重学SpringBoot3-怎样优雅停机

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-怎样优雅停机 1. 什么是优雅停机&#xff1f;2. Spring Boot 3 优雅停机的配置3. Tomcat 和 Reactor Netty 的优雅停机机制3.1 Tomcat 优雅停机3.2 Reac…

【C++初阶】模版入门看这一篇就够了

文章目录 1. 泛型编程2. 函数模板2. 1 函数模板概念2. 2 函数模板格式2. 3 函数模板的原理2. 4 函数模板的实例化2. 5 模板参数的匹配原则2. 6 补充&#xff1a;使用调试功能观察函数调用 3. 类模板3 .1 类模板的定义格式3. 2 类模板的实例化 1. 泛型编程 在C语言中&#xff0…

动态规划-子序列问题——1027.最长等差数列

1.题目解析 题目来源&#xff1a;1027.最长递增子序列——力扣 测试用例 2.算法原理 1.状态表示 等差数列至少是三个数&#xff0c;所以一维数组显然无法满足状态表示&#xff0c;所以需要开辟一个二维数组来表示&#xff0c;二维数组的两个下标分别是倒数第一与倒数第二个数 …

【JSON相关漏洞(Hijacking+Injection)挖掘技巧及实战案例全汇总】

JSON相关漏洞&#xff08;HijackingInjection&#xff09;挖掘技巧及实战案例全汇总 本文一是在为测试过程中遇到json返回格式时提供测试思路&#xff0c;二是几乎所有国内的资料都混淆了json和jsonp的区别——这是两种技术&#xff1b;以及json和jsonp hijacking的区别——这…

基于知识图谱的设备问答系统

你是不是还在为毕业设计苦恼&#xff1f;今天我就来给大家分享一款基于知识图谱的设备问答系统&#xff0c;不仅技术领先&#xff0c;而且非常适合用作毕业设计项目&#xff0c;帮助你轻松通过&#xff01; 项目简介 这个设备问答系统基于Django&#xff08;后端框架&#xf…

从零开始的 vue项目部署到服务器详细步骤(vue项目build打包+nginx部署+配置ssl证书)

从零开始的 vue项目部署到服务器详细步骤&#xff08;vue项目build打包nginx部署配置ssl证书&#xff09; 文章目录 从零开始的 vue项目部署到服务器详细步骤&#xff08;vue项目build打包nginx部署配置ssl证书&#xff09;一、前言二、vue项目部署前配置1、vite.config.js 增加…

ubuntu内核更新导致显卡驱动掉的解决办法

方法1&#xff0c;DKMS指定内核版本 用第一个就行 1&#xff0c;借鉴别人博客解决方法 2&#xff0c;借鉴别人博客解决方法 方法2&#xff0c;删除多于内核的方法 系统版本&#xff1a;ubuntu20.24 这个方法是下下策&#xff0c;如果重装驱动还是不行&#xff0c;就删内核在…

Spring 的事务传播机制

Spring 的事务传播机制定义了一个事务方法在遇到已经存在的事务时如何处理。事务传播属性&#xff08;Propagation&#xff09;提供了七种机制&#xff0c;以适应不同的业务需求和事务边界管理。 1. Spring 的事务传播机制的类型 &#xff08;1&#xff09;REQUIRED&#xff…

uv sync失败HTTP status server error (504 Gateway Timeout) for url (http://...)

内网环境下&#xff0c;服务器Linux系统可以正常uv sync更新和安装依赖&#xff0c;本地电脑Windows系统却总是报错&#xff0c;大致错误信息如下&#xff1a; error: Failed to download: xxxCaused by: HTTP status server error (504 Gateway Timeout) for url (http://...…