面试 Java 并发编程八股文十问十答第十二期

面试 Java 并发编程八股文十问十答第十二期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)线程安全:

线程安全指的是当多个线程同时访问某个资源时,不会产生不正确的结果。具体来说,线程安全的代码在多线程环境下能够保证数据的一致性、正确性和可预期的行为,不会出现竞态条件、数据竞争或者其他并发问题。线程安全的实现通常包括使用同步机制(如锁)、原子操作、并发数据结构等手段来确保共享资源的访问不会导致数据不一致或损坏。

2)线程和进程的区别:

线程和进程都是操作系统中的执行单元,但它们之间有一些重要的区别:

  • 进程是程序执行时的一个实例,拥有独立的内存空间和系统资源,可以包含多个线程。
  • 线程是进程中的一个执行路径,共享了进程的内存空间和资源,可以看作是进程中的子任务。一个进程可以包含多个线程,这些线程共享进程的地址空间和全局变量,但拥有各自的栈空间和局部变量。

简而言之,进程是资源分配的最小单位,而线程是 CPU 调度的最小单位。

3)协程:

协程是一种轻量级的线程替代方案,也被称为用户级线程或者绿色线程。与传统的线程相比,协程更加轻量级,因为它们由用户空间的库或者语言运行时管理,而不需要操作系统内核的支持。协程可以在单个线程中实现并发执行,通过在不同的协程之间进行切换来实现并发性,而不是通过线程的上下文切换。协程通常用于处理高并发、高吞吐量的场景,例如网络编程、IO 密集型任务等。

4)线程的生命周期:

线程的生命周期通常包括以下几个状态:

  1. 新建状态(New):线程被创建但尚未启动。
  2. 就绪状态(Runnable):线程已经被创建并且调用了 start() 方法,但是尚未被分配到 CPU 执行。
  3. 运行状态(Running):线程被分配到 CPU 执行,正在执行任务。
  4. 阻塞状态(Blocked):线程被挂起,通常是由于等待某个条件的发生,比如等待 I/O 操作完成、等待获取锁、等待其他线程的通知等。
  5. 等待/无限期等待状态(Waiting/Timed Waiting):线程等待某个特定条件的发生,等待的时间可能有限(Timed Waiting)也可能是无限期(Waiting)的。
  6. 终止状态(Terminated):线程执行完成或者因异常而终止。

5)线程之间的通信:

线程之间的通信可以通过共享内存或者消息传递来实现:

  • 共享内存:多个线程访问同一个共享变量或者内存区域,通过读写共享内存来进行通信。这种方式的优点是简单高效,但容易产生竞态条件和数据一致性问题,需要使用同步机制来保证线程安全。
  • 消息传递:线程之间通过发送和接收消息来进行通信,每个线程都有自己的独立内存空间,通过消息队列或者信号量等机制来实现线程间的数据传递和同步。这种方式的优点是避免了竞态条件和数据一致性问题,但需要额外的同步开销。

Java 中线程之间的通信可以通过 wait()、notify()、notifyAll() 方法来实现等待和唤醒机制,或者使用并发工具类如 CountDownLatch、CyclicBarrier、Semaphore 等来进行线程间的协调和通信。

6)进程之间的通信:

进程之间的通信通常通过以下几种方式来实现:

  • 管道(Pipe):一种半双工的通信方式,允许一个进程写入数据到管道,另一个进程从管道读取数据。在 Unix/Linux 系统中,管道通常通过 | 运算符来连接两个命令的标准输入和输出。
  • 信号(Signal):进程可以向另一个进程发送信号,通知其发生了某种事件。比如 Unix/Linux 系统中的 kill 命令可以向指定进程发送信号。
  • 消息队列(Message Queue):进程之间通过消息队列来传递数据,发送进程将消息写入队列,接收进程从队列中读取消息。消息队列通常由操作系统提供支持。
  • 共享内存(Shared Memory):多个进程共享同一块内存区域,可以直接读写共享内存来进行通信。但需要通过同步机制来保证数据的一致性和安全性。
  • 套接字(Socket):进程之间通过套接字进行网络通信,可以在同一台计算机上的不同进程之间进行通信,也可以在不同计算机上的进程之间进行通信。套接字通常用于网络编程和 IPC(进程间通信)。

选择哪种通信方式取决于具体的需求和环境,每种方式都有自己的特点和适用场景。

7)线程池的原理:

线程池是一种管理和复用线程的机制,通过预先创建一定数量的线程并维护一个线程队列,来执行提交的任务。线程池的原理主要包括以下几个关键点:

  • 线程复用:线程池会创建一定数量的线程,并将这些线程保存在线程池中,每当有任务提交时,线程池会选择一个空闲的线程来执行任务,从而避免了频繁地创建和销毁线程的开销。
  • 线程管理:线程池负责管理线程的生命周期,包括线程的创建、启动、执行任务、等待任务、关闭等操作。
  • 任务队列:线程池通常会维护一个任务队列,用于保存提交的任务。当线程池中的线程处于忙碌状态时,新的任务会被放入任务队列中等待执行。
  • 线程调度:线程池会负责调度任务的执行,根据任务的类型、优先级等因素来决定任务的执行顺序。
  • 资源限制:线程池可以根据系统资源的情况来限制线程的数量,避免线程过多导致资源耗尽或者系统负载过重。

8)设计线程池的步骤:

设计线程池需要考虑以下几个方面:

  1. 确定线程池的大小:根据系统资源、任务类型和性能需求等因素来确定线程池的大小,一般建议根据实际情况进行测试和调整。
  2. 选择合适的任务队列:选择合适的任务队列来保存提交的任务,常见的任务队列包括有界队列(如 ArrayBlockingQueue)和无界队列(如 LinkedBlockingQueue)。
  3. 定义线程池的拒绝策略:在任务提交过多或者线程池已满无法处理新任务时,需要定义一种合适的拒绝策略来处理这种情况,常见的拒绝策略包括丢弃任务、抛出异常、阻塞等待和调用者执行等。
  4. 实现线程池的执行逻辑:实现线程池的核心逻辑,包括任务提交、线程分配、任务执行、异常处理、线程池关闭等操作。
  5. 监控和调优:添加监控和调优功能,可以实时监控线程池的状态、任务执行情况和性能指标,并根据监控结果进行调整和优化。

9)线程池的线程数设置:

线程池的线程数设置应该根据系统资源、任务类型和性能需求等因素来确定,一般可以考虑以下几个原则:

  • 任务类型:CPU 密集型任务通常需要较少的线程数,而 IO 密集型任务则可以使用较多的线程数。
  • 系统资源:根据系统的 CPU 核数、内存大小和其他资源情况来确定线程池的大小,避免线程过多导致资源竞争和系统负载过重。
  • 性能需求:根据任务的响应时间和吞吐量需求来确定线程池的大小,一般通过压测和性能调优来确定合适的线程数。

一种常见的做法是通过公式或者根据经验设置线程池的大小,然后根据实际情况进行测试和调整,以达到最优的性能和资源利用率。

10)线程池的拒绝策略:

当线程池无法处理新提交的任务时,需要采取一种拒绝策略来处理这种情况,常见的拒绝策略包括:

  1. AbortPolicy(默认策略):直接抛出 RejectedExecutionException 异常,表示拒绝执行新任务。
  2. CallerRunsPolicy:将任务交给调用线程来执行,如果线程池已满,则由提交任务的线程来执行该任务。
  3. DiscardPolicy:直接丢弃新提交的任务,不做任何处理。
  4. DiscardOldestPolicy:丢弃任务队列中最旧的任务,然后尝试将新任务加入队列。

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

前后端总计已经 800+ Star,1.5W+ 访问!

⭐点赞⭐收藏⭐不迷路!⭐

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

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

相关文章

鸿蒙L0软总线demo程序

软总线是鸿蒙特有的功能之一&#xff0c;本篇提供了一个运行于L0的软总线demo程序。 demo的流程&#xff1a; 1.dsoftbus_start() 入口启动函数&#xff0c;启动后循环发布、发现、发现节点后连接节点。 int dsoftbus_start() {if (init() < 0) {return -1;}if (!dsoftbu…

2024年成都市企业技术标准制(修)订申报条件奖励、材料流程须知

一、2022 年期间奖励项目 (一)申报条件 2022 年期间主导制(修)订并获批发布国际、国家和行业技术标准的工业和信息化企业(其中:民营企业获批发布时间在2022年1月1日至2022年12月31日期间&#xff0c;其他企业获批发布时间在2022年1月1日至2022年7月7日期间)。 (二)支持标准 …

Kubernetes安全管理概览

目录 1、认证&#xff08;Authentication&#xff09;2、授权&#xff08;Authorization&#xff09;3、网络策略&#xff08;Network Policies&#xff09;4、Pod安全策略&#xff08;Pod Security Policies, PSP&#xff09;5、机密管理&#xff08;Secrets Management&#…

【QA】Java常见运算符

前言 本文主要讲述Java常见的运算符 运算符的概念 两个基本概念&#xff1a; 运算符&#xff1a;对字面量或者变量进行操作的符号 表达式&#xff1a;用运算符把字面量或者变量连接起来符合java语法的式子就可以称为表达式 示例&#xff1a; int a 10; int b 20; int …

Selenium——获取元素和操纵元素的方法

1、获取元素的方法 1、通过id获取 element wd.find_element(By.ID,"id")2、通过classname获取 elements wd.find_elements_by_class_name("plant") for element in elements:print(element.text)3、通过tagname获取元素 elements wd.find_elements_…

nacos核心源码深度剖析

文章目录 一、nacos1.4.1版本&#xff1a;服务注册与发现架构原理1、基本原理2、Nacos&Ribbon&Feign核心微服务架构图3、Nacos架构图4、核心功能点5、核心功能源码分析&#xff08;1&#xff09;客户端注册逻辑&#xff08;2&#xff09;服务端注册接口&#xff08;3&a…

python:机器学习特征优选

作者&#xff1a;CSDN _养乐多_ 在Python中进行机器学习特征选择的方法有很多种。以下是一些常用的方法&#xff1a; 过滤法&#xff08;Filter Methods&#xff09;&#xff1a;通过统计方法或者相关性分析来评估每个特征的重要性&#xff0c;然后选择最相关的特征。常用的…

Linux内核--设备驱动(七)媒体驱动框架整理--HDMI框架(2)

目录 一、引言 二、drm框架 ------>2.1、画布( FrameBuffer ) ------>2.2、绘图现场(CRTC) ------>2.3、输出转换器(Encoder ) ------>2.4、连接器 (Connector ) ------>2.5、显示面(Planner) 三、VOP部分详解 ------>3.1、dts ------>3.2、v…

【0DAY】瑞友天翼应用虚拟化系统index.php接口处存在SQL注入漏洞导致程RCE

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

04-程序控制结构

1. 控制结构介绍 决定程序是如何执行的。 三大流程结构 顺序结构选择结构循环结构 顺序结构 程序从上到下依次执行&#xff0c;中间没有任何判断和跳转。 简单示例 public class Main {public static void main(String[] args) {System.out.println("这是第一行&qu…

每日算法之路径总和

题目描述 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从父节点到…

和comate一起,用JavaScript实现一个简易版五子棋小游戏

前言 五子棋起源于中国&#xff0c;是全国智力运动会竞技项目之一&#xff0c;是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子&#xff0c;下在棋盘直线与横线的交叉点上&#xff0c;先形成五子连珠者获胜。 这次和Baidu Comate智能代码助手共同完成这个小游戏…

HarmonyOS NEXT应用开发之多模态页面转场动效实现案例

介绍 本示例介绍多模态页面转场动效实现&#xff1a;通过半模态转场实现半模态登录界面&#xff0c; 与全屏模态和组件转场结合实现多模态组合登录场景&#xff0c;其中手机验证码登录与账号密码登录都为组件&#xff0c; 通过TransitionEffect.move()实现组件间转场达到近似页…

在Python中获取当前线程的名字

多线程编程是一种常见的编程范式&#xff0c;它允许程序同时执行多个任务。在Python中&#xff0c;​​threading​​模块提供了对多线程编程的支持。了解和管理当前运行的线程是多线程编程中的一个重要方面。本技术博客将介绍如何在Python中获取当前线程的名字&#xff0c;并提…

Linux入门攻坚——22、通信安全基础知识及openssl、CA证书

Linux系统常用的加解密工具&#xff1a;OpenSSL&#xff0c;gpg&#xff08;是pgp的实现&#xff09; 加密算法和协议&#xff1a; 对称加密&#xff1a;加解密使用同一个秘钥&#xff1b; DES&#xff1a;Data Encryption Standard&#xff0c;数据加密标准&…

meshlab: pymeshlab保存物体的横截面(compute planar section)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 # pymeshlab需要导入&#xff0c;其一般被命名为ml import pymeshlab as ml# 本案例所…

05.添加自定义触发器

添加自定义触发器 在系统中找到一个用户登录数量的监控项&#xff0c;用该监控项作为参考实例 测试监控项取值&#xff0c;2代表为登录系统终端数量 创建触发器 表达式设置条件&#xff0c;选择对应的监控项&#xff0c;根据对应的功能函数&#xff0c;在选择触发的结果 添…

简洁大气APP下载单页源码

源码介绍 简洁大气APP下载单页源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 效果截图 源码下载 简洁大气APP下载单页源码

Jenkins +配置邮件 centos8.5 安装部署 运维系列一

1 jenkins的war包下载地址: Download and deploy 2 xftp 等方式上传到服务器 #安装jdk tar zxvf jdk-11.0.8_linux-x64_bin.tar.gz mv jdk-11.0.8/ /usr/local/jdk vim /etc/profile export JAVA_HOME/usr/local/jdk export PATH$JAVA_HOME/bin:$PATH CLASSPATH.:$JAVA_…

中国居民消费新特征:中枢回落,即时满足,去地产化

随着收入预期和财富效应的转变&#xff0c;居民更倾向于通过短期集中式的消费来获得即时满足的快乐&#xff0c;服务消费表现出了更强的韧性。服务消费强于商品消费、消费去地产化、汽车挑大梁的特征延续。 特征一&#xff1a;消费倾向高于2020-22年&#xff0c;低于2017-19年…