并发(8)

目录

46.Thread.sleep(),Object.wait(),Condition.await(),LockSupport.part()的区别?

47.如果在wait()之前执行了notify()会怎样?

48.如果在park()之前执行了unpark()会怎样?

49.什么是AQS?为什么他是核心?

50.AQS的核心思想是什么?


46.Thread.sleep(),Object.wait(),Condition.await(),LockSupport.part()的区别?

Thread.sleep()和Object.wait()的区别

首先,我们先来看看Thread.sleep()和Object.wait()的区别,这是一个烂大街的题目了,大家应该都能说上来两点。

1.Thread.sleep()不会释放占有的锁,Object.wait()会释放占有的锁。

2.Thread.sleep()必须传入时间,Object.wait()可传可不传,不传表示一直阻塞下去;

3.Thread.sleep()到时间了会自动唤醒,然后继续执行;

4.Object.wait()不带时间的,需要另一个线程使用Object.notify()唤醒。

5.Object.wait()带时间的,假如没有被Notify,到时间了会自动唤醒,这时又分两种情况,一是立即获取到了锁,线程自然会继续执行;二是没有立刻获取锁,线程进入同步队列等待获取锁;

其实,他们最大的区别就是Thread.sleep()不会释放锁资源,Object.wait()会释放锁资源。

Object.wait()和Condition.await()的区别

Object.wait()和Condition.await()的原理是基本一致的,不同的是Condition.await()底层是调用LockSupport.park()来实现阻塞当前线程的。

实际上,他在阻塞当前线程之前还干了两件事,一是把当前线程添加到条件队列中,而是”完全“释放锁,也就是让state状态变量变为0,然后才是调用LockSupport.park()阻塞当前线程。

Thread.sleep()和LockSupport.park()的区别

LockSupport.park()还有几个兄弟方法-parkNanos(),parkUtil()等,我们这里说的park()方法统称这一类方法。

1.从功能上来说,Thread.sleep()和LockSupport.park()方法类似,都是阻塞当前线程的执行,且都不会释放当前线程占有的锁资源;

2.Thread.sleep()没法从外部唤醒,只能自己醒过来。

3.LockSupport.park()方法可以被另一个线程调用LockSupport.unpark()方法唤醒。

4.Thread.sleep()方法声明上抛出了InterruptException中断异常,所以调用者需要捕获这个异常或者再抛出。

5.LockSupport.park()方法不需要捕获中断异常。

6.Thread.sleep()本身就是一个native方法。

7.LockSupport.park()底层是调用的Unsafe的Native方法;

Object.wait()和LockSupport.park()的区别

二者都会阻塞当前线程的运行,他们有什么区别呢?经过上面的分析相信你一定很清楚了,真的吗?往下看!

1.Object.wait()方法需要在synchronized块中执行;

2.LockSupport.park()可以在任意地方执行;

3.Object.wait()方法声明抛出了中断异常,调用者需要捕获或者再抛出。

4.LockSupport.park()不需要捕获中断异常。

5.Object.wait()不带超时的,需要另一个线程执行notify()来唤醒,但不一定继续执行后续内容。

6.LockSupport.park()不带超时的,需要另一个线程执行unpark()来唤醒,一定会继续执行后续内容;

park()/unpark()底层的原理是”二元信号量“,你可以把他相像成只有一个许可证的Semaphore,只不过这个信号量在重复执行unpark()的时候也不会再增加许可证,最多只有一个许可证。

47.如果在wait()之前执行了notify()会怎样?

如果当前的线程不是此对象锁的所有者,却调用该对象的notify()或者wait()方法抛出IIlegalMonitorStateException异常;

如果当前线程是此对象锁的所有者,wait()将一直阻塞,因为后续将没有其他notify()唤醒他。

48.如果在park()之前执行了unpark()会怎样?

线程不会被阻塞,直接跳过park(),继续执行后续内容。

49.什么是AQS?为什么他是核心?

AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效的构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。

AQS核心思想是,如果请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程假如到队列中。

AbstractQueuedSynchronizer类底层的数据结构是使用CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列(虚拟的双向队列即不存在队列实例,仅存在结点之间的关联关系)。AQS是将每条请求共享资源的线程封装成一个CLH锁队列的一个结点(Node)来实现锁的分配。其中Sync queue,即同步队列,是双向链表,包括head结点和tail结点,head结点主要用作后续的调度。而Condition queue不是必须得,其是一个单向链表,只有当使用Condition时,才会存在此单向链表。并且可能会有多个Condition queue。

50.AQS的核心思想是什么?

底层数据结构:AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程假如队列中。

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

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

相关文章

九州金榜|孩子厌学,作为父母有想做自己的原因吗?

孩子不会天生就厌学,如果孩子天生厌学,那么孩子就不可能学会说话,走路,日常生活,更不可能去上学,孩子厌学因素非常多,而作为父母,你有没有想过是你的原因造成的呢?九州金…

编程语言的未来,通用代码生成器和超级语言

编程语言的未来,通用代码生成器和超级语言 我们生活在一个编程语言种类繁多,百花齐放的年代。形形色色的编程语言覆盖了软件开发的方方面面。如果说这些变成语言有什么共性的话,大家都知道,大多数编程语言是高级语言。 何为高级…

K8S---通过curl访问api

1、列出所有的接口 curl --cacert /opt/kubernetes/ssl/ca.pem --cert /opt/kubernetes/ssl/default-admin.pem --key /opt/kubernetes/ssl/default-admin-key.pem https://10.240.184.74:6443/ 2、列出核心api的版本 curl --cacert /opt/kubernetes/ssl/ca.pem -…

手敲MyBatis(十四章)-解析含标签的动态SQL语句

1.前言 这一章主要的就是要解析动态标签里的Sql语句,然后进行条件语句的拼接,动态标签实现了trim和if标签,所以Sql节点就要加上TrimSqlNode和ifSqlNode,我们最终要获取Sql源,动态Sql语句需要一些处理,所以…

SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于SpringCloud的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一. 远程消费组件是什么 二. 远程消…

竞赛练一练 第22期:NOC大赛每日一练,python题目刷题第7天,包含答案解析

题目来自:NOC大赛创客智慧编程赛项Python 复赛模拟题(一) 第一题: 编写一个彩票游戏:随机生成一个不重复的五位数作为彩票号,游戏提示用户输入一个五位整数,然后根据下面的规则判断用户是否能赢得奖金,最后要求输出彩票号和奖金。 (1)若用户输入的数字和彩票的数字完…

c语言考试代码

文章目录 文件操作题 “%”:格式化字符串的起始标志。 “0”:表示使用零来填充输出字段的宽度。 “4”:表示输出字段的宽度为4个字符,如果输出的十六进制数不足4位,则在左边用零进行填充。 “x”:表示以十六…

MySql海量数据存储与优化

一、Mysql架构原理和存储机制 1.体系结构 2.查询缓存 3.存储引擎 存储引擎的分类 innodb:支持事务,具有支持回滚,提交,崩溃恢复等功能,事务安全myisam:不支持事务和外键,查询速度高Memory:利…

Spring Boot实现数据加密脱敏:注解 + 反射 + AOP

文章目录 1. 引言2. 数据加密和脱敏的需求3. Spring Boot项目初始化4. 敏感数据加密注解设计5. 实现加密和脱敏的工具类6. 实体类和加密脱敏注解的使用7. 利用AOP实现加密和脱敏8. 完善AOP切面9. 测试10. 拓展功能与未来展望10.1 加密算法的选择10.2 动态注解配置 11. 总结 &am…

CHS_02.1.1.2+操作系统的特征

CHS_02.1.1.2操作系统的特征 操作系统的四个特征并发这个特征为什么并发性对于操作系统来说是一个很重要的基本特性资源共享虚拟异步性 各位同学 大家好 在这个小节当中 我们会学习 操作系统的四个特征 操作系统有并发 共享 虚拟和异部这四个基本的特征 其中 并发和共享是两个…

机器人的末端执行器由什么零件组成,有什么作用。

问题描述:机器人的末端执行器由什么零件组成,有什么作用。 问题解答: 机器人的末端执行器是机器人机械结构的最末端部分,用于执行具体的任务和与环境进行交互。末端执行器通常由多个零部件组成,其主要作用是完成机器…

log4j RCE漏洞原理分析及检测

实现原理 log4j支持使用表达式的形式打印日志,比如 logger.info("system propety: ${sys:user.dir}");问题就在与表达式支持非常多样,其中有一个jndi就是今天的主题 logger.info("system propety: ${jndi:schema://url}");jdk将从…

学习笔记——C++ do while语句

作用&#xff1a;满足循环条件&#xff0c;执行循环语句 语法&#xff1a;do{循环语句}while{循环条件}&#xff1b; 注意&#xff1a;与while的区别在于do while 会先执行一次循环语句&#xff0c;再判断循环条件。 示例&#xff1a;打印0-9的数字 #include<bits/stdc.h…

图神经网络|9.3 邻接矩阵的变换

由于邻接矩阵中一般不会&#xff08;i,i&#xff09;等于1&#xff0c;除非第i个点上有自环。 而如果用邻接矩阵去乘上特征矩阵&#xff0c;那么将丢失自身向自身的贡献。 此时可以再邻接矩阵的基础上&#xff0c;再加上一个单位阵&#xff0c;从而使得最终的结果包含自身对整体…

RedisInsight - Redis官方可视化工具

一、RedisInsight 简介 RedisInsight 是一个直观高效的 Redis GUI 管理工具&#xff0c;它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控&#xff0c;并且可以在界面上使用 CLI 和连接的 Redis 进行交互&#xff08;RedisInsight 内置对 Redis 模块支持&#…

JavaWeb——新闻管理系统(Jsp+Servlet)之jsp新闻新增

java-ee项目结构设计 1.dao:对数据库的访问&#xff0c;实现了增删改查 2.entity:定义了新闻、评论、用户三个实体&#xff0c;并设置对应实体的属性 3.filter&#xff1a;过滤器&#xff0c;设置字符编码都为utf8&#xff0c;防止乱码出现 4.service:业务逻辑处理 5.servlet:处…

一文讲透使用SPSS统计分析软件绘制双轴线图

双轴线图主要用来展示两个因变量和一个自变量的关系&#xff0c;并且两个因变量的数值单位不同时的情形。具体来说&#xff0c;双轴线图是指在一幅图上有一个横轴和两个纵轴&#xff0c;适用于三个变量。两个纵轴分别表示一个变量&#xff0c;横轴变量同时适用于两个纵轴上的变…

【InternLM】Lagent智能体工具调用实践浦语·灵笔(InternLM-XComposer)图文理解创作Demo练习

目录 前言一、Lagent智能体工具1-1、什么是智能体&#xff1f;1-2、Lagent智能体 二、InternLM-XComposer&#xff08;图文理解创作模型介绍&#xff09;三、Lagent调用实践3-0、环境搭建3-1、创建虚拟环境3-2、导入所需要的包3-3、模型下载3-4、Lagent安装3-5、demo运行 四、I…

【Navigation】global_planner 源码解析

全局规划器 global_planner 功能包 文章目录 global_planner 功能包结构1、plan_node.cpp2、planner_core.cpp3、astar.cpp4、dijkstra.cpp5、quadratic_calculator.cpp6、grid_path.cpp7、gradient_path.cpp8、orientation_filter.cpp全局规划大都基于静态地图进行规划,产生路…

完善 Golang Gin 框架的静态中间件:Gin-Static

Gin 是 Golang 生态中目前最受用户欢迎和关注的 Web 框架&#xff0c;但是生态中的 Static 中间件使用起来却一直很不顺手。 所以&#xff0c;我顺手改了它&#xff0c;然后把这个改良版开源了。 写在前面 Gin-static 的改良版&#xff0c;我开源在了 soulteary/gin-static&a…