如何回答join到底释不释放锁?

锁释放的场景 好问题!这涉及到Java并发编程中最核心的概念辨析。我来系统性地回答。 阅读详情

面试官:请问join方法释放锁吗?

求职者:......

        这个问题在面试中算是个中级问题,如果你没有深入了解join阻塞的机制,那么你很难完美地回答这个问题,OK,进入正题!

        首先,要搞清楚,面试官所说的释放锁是什么场景,看个示例:

synchronized(obj) {
    subThread.join()
}

对,就是这样,面试官的意思是在一段synchronized代码段内,调用join,是否会释放锁?

解析

        之所以说这个问题不太好回答,是因为这种问题具备逐层深挖的特点,一般面试官的套路总是由浅入深,逐级让面试者说出问题的表象以及背后的原理。因此,面对这类问题,先给出一个不完整的回答,未尝不是一个好的选择,这样的话,可以让面试者接着问更深一层的问题,说白了,就是配合面试官完成他的套路。

        join方法一般是用在这样一个场景:父线程等待子线程完成后再继续执行;即:在哪个线程的逻辑中执行join,哪个线程就等待,等待那个调用了join的线程完成。

        比如:在A线程的代码中,执行了B线程的join方法,A线程就要等待B线程完成。如此说来,join是不释放锁的!——当然,这么回答也OK,但面试官马上会问:

面试官:既然不释放锁,那就是阻塞的喽,join如何实现线程阻塞的呢?

求职者:......

 join阻塞原理

join实现线程阻塞的原理很简单,就是死循环!

普通的父子线程调用流程

父线程main调用子线程sub,然后两个线程同时执行各自的代码逻辑

jion调用流程

如图,父子线程仍然是各跑各的逻辑,只不过因为是在main线程中调用的join,因此main线程就被塞进了一句join的同步代码逻辑,阻塞的原理就在这个join方法中;

 如图所示,join的逻辑就是一个死循环,循环判断sub线程的状态,如果sub线程状态未结束,则调用wait(0)方法,然后继续循环判断。

 OK,到此又引出第三个问题:

面试官:既然最终调用的是wait方法,那为什么说join不释放锁呢?

求职者:......

源码

进入源码环节,首先要明确一点:wait一定会释放锁!这个毋庸置疑,那么之所以说join不释放锁的原因是因为wait释放的锁压根就不是外层的那个锁(对象)!

看源码,可以看到join方法被synchronized修饰,这就说明,join方法中wait释放的锁是当前线程对象,而不是join以外的锁对象。

    public final synchronized void join(long millis)
    throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (millis == 0) {
            while (isAlive()) {
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }

SQL 中 JOIN 的执行顺序优化指南 SQL查询中JOIN的执行顺序优化是数据库性能调优的关键。数据库引擎会根据表大小、索引情况、JOIN类型等因素动态确定最优JOIN顺序。优化技巧包括使用STRAIGHT_JOIN强制顺序、更新统计信息、查询提示等。对于复杂多表连接,建议分解查询或使用物化视图。不同数据库的JOIN优化特性各异,需通过EXPLAIN分析执行计划。面试时应重点展示通过具体案例优化JOIN性能的经验。 阅读详情

相关推荐

ESP32 LVGL开发板例程使用记录:自制常用汉字字库(二)

1、将下载的文件移入工程文件中 ,路径为项目文件中 ”......\lib\lvgl\src\font“文件夹下。3、修改字库配置文件,文件名为lv_conf.h中的内容,向其中加入下面内容(位置可搜索注释块来找到地方)修改完成可以编译试试,看是否成功,如字库较大时编译出错,请使能:LV_FONT_FMT_TXT_LARGE。2、打开此文件,修改包含头文件的路径,不然会报错,修改方法可对照自己库中其他字库文件中的包含路径。导入完成后在VSCode工程中可以查看到此文件。上次说完了如何制作 字库.c 文件。

qq_43279097的博客 1955

JAVA多线程:狂抓 join()方法到底会不会释放锁,给你彻底介绍清楚(三)

结论是:join()只会释放Thread的锁,不会释放线程对象的锁(可能会造成死锁),原因是因为:join底层调用的是wait(),而wait是Object的方法,wait本身是会释放锁(彻底交出CPU的执行权),所以 Thread 的join() 方法会释放锁,单独需要看情况(synchronized作用对象是thread还是object)

血煞长虹 的专栏 6421

【STM32-DSP库的使用】基于Keil5 + STM32CubeMX + CMSIS-DSP 手动添加、库添加方式

CMSIS-DSP库在工程中应用遇到的所有问题进行归纳终结

洋洋的博客 1万+

join()方法是否会释放锁?

众所周知,join()方法底层调用了wait()方法,那么wait()方法明明是会释放锁的,为什么会有join是否释放锁的这个问题出现呢?原因是因为join()方法只会释放内部锁(自己方便的叫法),不会释放外部锁(自己方便的叫法)。 废话不多说,上代码 public synchronized void test(Object obj){ //join不释放锁 可能引起死锁 thread.join(); } public synchronized void test(Thr

qq_55253420的博客 1760

用workbuddy自定义Skill:手把手搭建AI炒股分析助手

AI Agent正成为个人投资研究的重要工具,而Skill作为行为规范,能让AI输出保持稳定与专业。在AI Agent应用中,很多人分不清Skill与Agent的区别:Agent负责目标拆解与执行,Skill则固化分析流程与输出模板。借助本地工作台workbuddy,用户可自定义Skill,实现从市场环境检查到财务排雷的五段式分析。通过调低温度参数、设定数据验证规则,该方案能有效避免大模型凭空编造数据,帮助个人投资者快速完成基本面体检、资金面观察与风险清单生成。本文基于一套可直接套用的配置与一个月实测,展示

weixin_29038537的博客 516

【QMIX】一种基于Value-Based多智能体算法

文章目录1. QMIX 解决了什么问题(Motivation)2. QMIX 怎样解决团队收益最大化问题(Method)2.1 算法大框架 —— 基于 AC 框架的 CTDE(Centralized Training Distributed Execution) 模式 QMIX 是一种基于 Value-Based 的多智能体强化学习算法(MARL),其基本思想来源于 Actor-Critic 与 DQN 的结合。使用中心式学习(Centralized Learning)分布式执行(Distributed

qq_38638132的博客 9859

Join()会不会释放锁?

文章目录答案Demo分析拾遗 答案 会 不过不能确切的说 Demo 网上找了很久没有找到答案,从书中找答案,《Java并发编程艺术》、《Java并发编程实战》均没有找到,在《Java多线程编程核心技术》中找到了答案,这个Demo来自这本书的268页: package com.leesin.heightConcurrent.join; /** * @description: join会释放锁 ...

牧夏的个人博客 9165

Oracle19c-集群节点重新添加

Oracle RAC集群在极端情况下,如硬件、主机,集群软件损坏,导致集群节点永久无法使用,需要对集群节点进行修复,删除节点集群信息并重新加入集群,以恢复集群原有的架构。 本文主要讲述一套两节点的Oracle19c RAC集群,节点一orcl01由于主机异常无法正常启动,在对主机进行重装之后,需要将orcl01节点重新加入集群的操作步骤。环境信息: 操作系统:Linux 7 RAC集群:19C 主机节点:orcl0...

sinat_36757755的博客 2351

join是不是释放锁

关于这个问题,大体有两种说法,一种是不释放锁,另一种是释放锁。这里直接说结论:当join前面的对象与synchronized一致时,释放锁。否则不释放。为什么呢? 首先这里需要简单说一下线程的创建和死亡,如下图: 如图可知,线程创建后,通过thread.satrt()方法启动线程,此时线程进入runnable状态,直到获取时间片进入运行状态到线程结束,这里不作赘述。重点说一下当run状态进入runnable状态时,当通过object.wait()方法时会释放锁,而其他进程得到锁得以执行,除非被notify

herowgq的博客 1036

涨点神器:基于YOLOv8的SPD-Conv小目标检测实战教程——让低分辨率场景检测精度飙升

从代码修改到场景落地,每一步都围绕“提升检测精度”这个核心目标,而实际数据也证明了这项技术的强悍——它不是实验室里的花拳绣腿,而是能真正解决工业痛点的涨点神器。在实际场景中,比如无人机巡检的低分辨率航拍图中,对电线、小设备的检测,YOLOv8-SPD的漏检率降低了70%以上。落地时,只需将训练好的YOLOv8-SPD模型部署到边缘设备或云端,即可享受其在小目标、低分辨率场景下的强大性能。的特征融合模块中,通过插入SPD-Conv,让模型在处理小目标时,既能保留空间细节,又能增强通道维度的特征表达。

m0_71589036的博客 157

【MATLAB】STM32电机调速闭环控制工程

本文提出了一种基于MATLAB仿真与STM32实现的直流电机闭环PID调速控制方案。通过MATLAB建立电机数学模型并进行参数整定,仿真验证了增量式PID算法在启停、稳态和抗扰动方面的优越性能。基于STM32F103搭建了硬件系统,实现了编码器测速、定时中断控制、PWM输出等功能。实测表明,该系统转速超调<2%、稳态误差±2r/min,具备快速响应和强抗扰能力。相比开环控制,闭环调速显著提升了动态性能和稳态精度。方案提供了完整的仿真代码和嵌入式工程源码,可直接应用于智能小车、工业传动等场景,具有较高的

unber的博客 50

Java-sleep()、wait()、join()、yield()的区别

关于线程,作为八股文面试中必问点,我们需要充分了解sleep()、wait()、join()以及yield()的区别。在正式开始之前先让我们了解两个概念:锁池和等待池所有需要竞争同步锁的线程都会放在锁池当中,比如当前对象的锁已经被其中一个线程得到,则其他线程需要在这个锁池进行等待,当前面的线程释放同步锁后锁池中的线程去竞争同步锁,当某个线程得到后会进入就绪队列进行等待cpu资源分配。当我们调用wait()方法后,线程会放到等待池当中,等待池的线程是不会去竞争同步锁。

努力搬砖,顶峰相见 524

100天精通Python(可视化篇)——第89天:Bokeh库绘图可视化基础入门(参数说明+案例实战)

专栏导读 一、Bokeh是什么? 二、安装与导入 三、Bokeh接口介绍 四、创建图表 五、添加自定义渲染器 切换主题 添加图例 图例位置 图例方向 图例背景和边界 图例文本的外观 行列布局 网格布局

努力让自己发光,对的人才能迎着光而来 1万+

服务 mysql 不用join_在SQL或MySQL中不使用JOIN关键字的联接有问题吗?

在SQL或MySQL中不使用JOIN关键字的联接有问题吗?当我开始编写数据库查询时,我还不知道JOIN关键字,自然地,我只是扩展了我已经知道的内容并编写了这样的查询:SELECT a.someRow, b.someRowFROM tableA AS a, tableB AS bWHERE a.ID=b.ID AND b.ID= $someVar现在,我知道这与INNER JOIN相同,我在代码中找...

weixin_33837846的博客 2014

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【并发基础】join()方法底层原理详解

详细讲解Thread类中join()方法实现线程的强制执行,通过底层源码深入了解方法原理,彻底了解join方法的运作机制。

小七的博客 4289

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

为何阿里不推荐MySQL使用join?

DBA禁用join 若有两个大小不同的表做join,用哪个表做驱动表? 今天这篇文章,我就先跟你说说join语句到底是怎么执行的,然后再来回答这两个问题。 示例表: 往表t2里插入了1000行数据 在表t1里插入的是100行数据 可见,两表都有一个主键索引id和一个索引a Index Nested-Loop Join select * from t1 straight_join t2 on (t1.a = t2.a); 若直接使用join语句,MySQL优化器可能会选择表t1或t2作为驱动表,.

JavaEdge全是干货的技术号 2675

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数据库面试必备:为什么在MySQL中不推荐使用多表JOIN?

在数据库设计和查询优化中,JOIN操作是最基础也是最强大的功能之一。然而,在MySQL环境中,过度使用多表JOIN(特别是涉及大量表的JOIN)往往会带来严重的性能问题。本文将深入探讨MySQL中不推荐使用多表JOIN的原因,并提供一些替代方案。

qq_58299462的博客 891

数据库面试必备:MySQL中INNER JOIN、LEFT JOIN和RIGHT JOIN的区别详解

在MySQL数据库操作中,JOIN操作是最常用且最重要的功能之一,它允许我们从多个表中获取相关联的数据。本文将详细解释INNER JOIN、LEFT JOIN和RIGHT JOIN这三种主要JOIN类型的区别,并通过实例和图表演示它们的工作原理。

qq_58299462的博客 1472

oracle里面inner join 和left join 的区别

维度INNER JOINLEFT JOIN返回行数等于两表匹配的行数至少等于左表行数(可能更多,若右表有多条匹配)NULL 值不会产生 NULL(不匹配行已过滤)右表无匹配时全部为 NULL主表无主次之分左表是主表,全部保留典型场景需严格对应关系的数据需保留主表全部数据,补充关联信息。

juanmiao的专栏 1027

【SQL】inner join、outer join、cross join和left join、right join、full join的区别

综合几篇写的,弄成自己看的懂的了: 转载地址: http://blog.youkuaiyun.com/scythe666/article/details/51881235 http://blog.youkuaiyun.com/xiaoshunzi111/article/details/68482772 https://www.cnblogs.com/wq3435/p/6677937.html 还有百度知

baocheng_521的博客 890

SQL21 浙江大学用户题目回答情况 联接 join

最后一行表示:id为7的用户的常用信息为使用的设备id为4321,性别为男,年龄26岁,复旦大学,gpa为3.6在过去的30天里面活跃了9天,发帖数量为6,回答数量为52。第一行表示:id为1的用户的常用信息为使用的设备id为2138,性别为男,年龄21岁,北京大学,gpa为3.4在过去的30天里面活跃了7天,发帖数量为2,回答数量为12。最后一行表示:id为7的用户的常用信息为使用的设备id为2315,在question_id为117的题目上,回答错误。示例:user_profile。

weixin_68458989的博客 729

关于join的定义(join 和 inner join的区别和疑问)

疑问:join等价于inner join?不用关联条件的join等价于cross join?inner join 在学的时候理解为了交集,然后没有交集就理解为空集,就理解错了很多人学 SQL 时会被绕进去,特别是把JOIN想成“交集”这种数学集合类比,很容易误导。

chao_789的博客 729

sql 查询 tag_阿里规范不建议多表join,可这SQL要怎么写

前言我们先来看一下阿里开发手册的描述手册上写着【强制】,但是相信很多同学项目里面的代码都不满足这个要求。但是关键问题是,不用join,这SQL究竟要怎么写啊!高性能MySQL高性能MySQL这本书相信大家都看过,在分解大的查询这部分提到。分解关联查询,即对每个要关联的表进行单表查询,然后将结果在应用程序中进行关联。下面的这个查询:SELECT * FROM tag JOIN tag_post ON...

weixin_39794734的博客 177

join on 后跟or有什么用_如果在ON子句中使用OR,MySQL将不会在JOIN中使用可用索引

假设您有5个表格,每个表格都有一列:>房屋(编号,名称,街道编号)>街道(ID,名称)>照片(身份证,姓名)> house_photo(house_id,photo_id)> street_photo(street_id,photo_id)并说所有“ id”列和以“ _id”结尾的列都已经有索引.(实际上,我的查询与房屋或街道无关.这是出于争论的缘故.)现在说您想将每...

weixin_39560002的博客 1895

MySQL为什么不建议使用多表JOIN

之所以不建议使用JOIN查询,最主要的原因就是JOIN的效率比较低。MySQL是使用了嵌套循环(Nested-Loop Join)的方式实现关联查询的,简单点说就是要通过两层循环,用第一张表做外循环,第二张表做内循环,外循环的每条记录跟内循环中的记录作比较,符合条件的就输出。而具体到算法实现上主要是simpl nested loop,block nested loop和index nested loop这三种。而且这三种的效率都没有特别高的。

qq984676583的博客 907
上一篇: 面试官必看的线程池核心细节
下一篇: 《Shiro三部曲1》——前世今生
lsunwing
博客等级 码龄21年 83粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值