并发编程常见面试题

文章目录

    • 为什么要使用线程池
    • 为什么不建议使用 Executors静态工厂构建线程池
    • synchronized的实现原理
    • Synchronized和Lock的区别
    • 什么是AQS
    • 什么是阻塞队列

为什么要使用线程池

关于线程池的作用和线程池的执行流程参考:java线程池

为什么不建议使用 Executors静态工厂构建线程池

根据阿里巴巴Java开发手册,明确指出不允许使用Executors静态工厂构建线程池。
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的写的目的是为了更加明确线程池的运行规则,规避资源耗尽的风险。
在这里插入图片描述

synchronized的实现原理

参考:synchronized及锁优化

Synchronized和Lock的区别

底层工作机制不同

  • synchronized关键字是属于JVM层面实现的,它的底层是通过monitor对象来完成的,其中
    wait/notify等方法也依赖monitor对象,只有在同步代码块和同步方法中才能调用wait/notify等方法。
  • Locksynchronized不同,它是一个具体的类,它是java api层面的锁

使用方式不同

  • Synchronized关键字运行后是不需要用户去手动释放锁的,在synchronized代码执行成功后系统会自动让线程释放对锁的占据。
  • ReentrantLock锁运行后需要用户手动去释放锁,如若用户没有主动去释放锁,就有可能导致出现死锁现象。ReentrantLock需要使用lock()unlock()方法配合try finally语句块来完成。
class X {private final ReentrantLock lock = new ReentrantLock();// ...public void m() {lock.lock();  // block until condition holdstry {// ... method body} finally {lock.unlock()}}}

是否可中断

  • synchronized不能中断,除非抛出异常或正常运行完成
  • ReetrantLock可中断,无影响

是否公可实现公平锁

  • synchronized是一个非公平锁
  • ReetrantLock可以实现公平也可以实现非公平

是否支持条件唤醒

  • synchronized不支持多条件
  • 如果使用ReentrantLock来实现分组唤醒需要唤醒的线程们,就可以精确唤醒,不会象synchronized样,要么随机唤醒一个,要么唤醒全部线程。

什么是AQS

AbstractQueuedSynchronizer简称AQS,是一个用于构建锁和同步容器的框架。事实上concurrent包内许多类都是基于AQS构建,例如ReentrantLock,Semaphore,CountDownLatch,ReentrantReadWriteLock,FutureTask等。AQS解决了在实现同步容器时设计的大量细节问题。

在这里插入图片描述
AQS使用一个FIFO的队列表示排队等待锁的线程,队列头节点称作“哨兵节点”或者“哑节点”,它不与任何线程关联。其他的节点与等待线程关联,每个节点维护一个等待状态waitStatus

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

什么是阻塞队列

阻塞队列是一个在队列基础上又支持了两个附加操作的队列

BlockingQueue 继承了 Queue 接口,是队列的一种。QueueBlockingQueue 都是在 Java 5 中加入的。

BlockingQueue 是线程安全的,在很多场景下都可以利用线程安全的队列来优雅地解决业务自身的线程安全问题。比如说,使用生产者/消费者模式的时候,生产者只需要往队列里添加元素,而消费者只需要从队列里取出它们就可以了。

在这里插入图片描述
阻塞插入:队列满时,队列会阻塞插入元素的线程,直到队列不满
阻塞移除:队列空时,获取元素的线程会等待队列变为非空

应用场景

阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。简而言之,阻塞队列是生产者用来存放元素、消费者获取元素的容器。

常用的阻塞队列如下:
在这里插入图片描述
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞。

在这里插入图片描述 java.util.concurrent.BlockingQueue的特性是:当队列是空的时,从队列中获取或删除元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。

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

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

相关文章

ffmpeg3.1.1版本连接ftp服务器失败

发现这个问题是在ffmpeg4之后修复的: 原因在于libavformat文件下的ftp.c文件: 修改方法:加入在TCP控制连接时加入应答代码202: static int ftp_features(FTPContext *s) {static const char *feat_command "FEAT\r\…

cfa二级大神复习经验分享系利(七)

这是我第二次参加二级考试,去年第一次参加二级,虽然考完感觉还不错,但最终成绩是Band 8,距离通过还是差了不少,在郁闷了几天后,重新振作,终于在第二次考试中稳稳通过。在考试经验总结之前&#…

云HIS医院信息管理系统源码(二级、乡镇、民营医院):云HIS系统与传统HIS系统的不同

云HIS医院信息管理系统源码(二级、乡镇、民营医院):云HIS系统与传统HIS系统的不同 什么是医疗SaaS软件平台? HIS-SaaS(Hospital Information System Software as a Service)是一种医院信息系统的服务模式&…

引领数字创作新潮流——Autodesk Maya 2025 for Mac/win

作为全球领先的三维动画和视觉特效软件,Autodesk Maya 2025 引领着数字创作的新潮流。无论是电影、游戏、电视剧还是虚拟现实项目,Maya 2025 都是创作者们不可或缺的强大工具。 Maya 2025 在功能上持续创新,提供了一系列强大的工具和功能&am…

npm是什么 ?

npm是Node.js生态系统的基石,它不仅让你能够轻松安装和管理软件包(或称为“模块”),还提供了丰富的功能来增强你的开发流程。想象npm如同一个巨大的工具箱,里面装满了各种工具,从基础的螺丝刀到高级的电子测…

Delphi编程之旅:从零开始到实战精通

Delphi编程之旅:从零开始到实战精通 Delphi基础:启动你的编程引擎安装与环境搭建第一个程序:“Hello, Delphi!” Pascal语言精要基本语法面向对象编程 实战案例:构建一个简易记事本应用UI设计功能实现保存与加载文本 安全性与性能…

【网络与并发编程】

网络与并发编程 1. 网络编程1.1 网络基础知识1.1.1 什么是网络1.2.3 网络功能1.2.3 网络分类1.2.4 网络性能衡量指标1.2.5 网络编程中的几个关键概念1.2.6 网络通信要解决的问题1.2.7 网络通信协议1.1.8 网络通信标准1.1.9 通信地址 1.2 UDP 传输方法1.2.1 套接字简介1.2.2 UDP…

MyBatis系统学习篇 - MyBatis的缓存

MyBatis的缓存实现原理主要基于三级缓存机制,包括一级缓存(本地缓存)、二级缓存(全局缓存)和三级缓存(跨会话缓存)。这个缓存在我们实际开发中可以避免我们查询重复的数据,在一定程度…

rust 学习--所有权

所有权是rust的核心功能。 Rust 是通过所有权来管理内存回收的 栈(Stack) 栈是后进先出的 栈中存储的数据在编译时是固定内存大小的数据 数据移除栈叫出栈,数据存入栈叫入栈 入栈要比在堆上分配内存块,入栈时分配器无需为存储…

【全开源】智能名片系统源码(Fastadmin+ThinkPHP和Uniapp)

数字时代的新名片,连接未来的桥梁 引言 在数字化浪潮的推动下,传统名片已经逐渐淡出人们的视线。取而代之的是智能名片系统,它以其高效、便捷和智能化的特点,成为了商务交流的新宠。而智能名片系统源码,作为其核心驱…

Spring Cloud应用框架

一、引言 随着微服务架构的兴起,如何有效地管理和协调微服务之间的通信、配置、服务发现、熔断等成为了关键问题。Spring Cloud作为一套微服务解决方案,提供了丰富的组件和功能,帮助开发者快速构建和部署微服务应用。本文将详细介绍Spring C…

SAP销售手工发票录入

销售手工发票录入用于处理未启用 SD 模块标准处理流程的零星销售业务。 科目设置 收入类科目:设置税务类型,允许含税/不含税过账应收账款: 留空。其他应收款的设置类似 编辑选项设置 在中国,编辑选项一般设置为基于总额计税。使用事务码 FB…

2024 Etsy替代品:推荐探索手工艺品销售的其他平台

在寻找一个适合销售手工艺品的平台时,Etsy可能是许多人首先想到的选择。然而,除了Etsy之外,还有许多其他平台可以帮助手工艺品制作者推广和销售他们的作品。在本篇文章中,我们将探索一些Etsy的替代品,为您提供更多销售…

操作系统课程实验3-可变分区存储管理

操作系统课程实验3-可变分区存储管理 一、实验介绍 1.1 实验目的 加深对可变分区存储管理的理解;提高用C语言编制大型系统程序的能力,特别是掌握C语言编程的难点:指针和指针作为函数参数;掌握用指针实现链表和在链表上的基本操作…

React Native 之 图片使用(六)

静态图片资源 React Native项目中,图片文件的查找会和 JS 模块的查找方式一样。它提供了一个统一的方式来管理 iOS 和 Android 应用中的图片。要往 App 中添加一个静态图片,只需把图片文件放在代码文件夹中某处,然后像下面这样去引用它&…

如何设计足够可靠的分布式缓存体系,以满足大中型移动互联网系统的需要?no.31

传统 CAP 的突破 随着分布式系统的不断演进,会不断遇到各种问题,特别是当前,在大中型互联网系统的演进中,私有云、公有云并行发展且相互融合,互联网系统的部署早已突破单个区域,系统拓扑走向全国乃至全球的…

新书推荐:6.2 else if语句

本节必须掌握的知识点: 示例代码二十 代码分析 汇编解析 ■if语句表达形式3 if(表达式1) statement1 else if(表达式2) statement2 else if(表达式3) statement3 …… else statementN 解析: 如果表达式1非0,则执行statement1&#…

记录github小程序短视频系统的搭建过程

GitHub - lkmc2/AwesomeVideoWxApp: 《倾心短视频》微信小程序 这个项目按readme中的来可以部署成功,但是会发现图片、视频全是空的,如下图: 修改源代码,更换图片上传与保存地址 大概涉及到这些代码块,进行更改即可。…

什么样的数据摆渡设备,可以满足不同网间数据的安全传输需求?

数据摆渡设备是用来在不同的网络环境间安全地传输数据的硬件或软件解决方案。它们通常用于确保在具有不同安全级别的网络(如内网和外网)之间进行数据交换时的安全性和合规性。以下是一些常见的数据摆渡设备和方法: 移动介质拷贝:使…

生产制造边角料核算说明及ODOO演示

今天群里有伙伴提到边角料的处理问题,我们梳理了一下,在生产过程中,如果产生了边角料,核算产成品的投料成本时需要考虑边角料的价值,以确保成本核算的准确性。以下是注意的几点: 一、边角料的入账价值 在生…