java 多线程面试

1并行和并发有什么区别?
 并行是指多个任务同时执行,需要多核处理器支持,可以显著提高程序的运行速度;
并发是指多个任务交替执行,通过时间片轮转实现,即使在单核处理器上也能实现多任务同时执行的效果。

2线程和进程的区别?
进程是系统进行资源分配和调度的一个独立单位,拥有独立的内存空间和系统资源;
线程是进程的一个实体,是CPU调度和分派的基本单位,共享所属进程的资源。

3守护线程是什么?
指在后台提供服务的线程,当所有的非守护线程结束时,守护线程会自动销毁。
它主要用于在程序运行过程中提供一些辅助性工作,如垃圾回收线程

4创建线程有哪几种方式?
继承Thread类并重写run()方法;
实现Runnable接口并实现run()方法;
实现Callable接口并使用Executor框架来启动线程;
使用匿名内部类创建线程;
使用线程池来管理线程的生命周期。

5说一下 runnable 和 callable 有什么区别?
 Runnable是Java中定义线程任务的接口,只能用于表示一个无返回值的任务;
Callable是Java 5中引入的接口,与Runnable类似,但可以返回执行结果,并且可以抛出异常。

6线程有哪些状态?
新建(New):线程对象被创建但还未启动。
运行(Runnable):线程正在Java虚拟机中运行。
阻塞(Blocked):线程因为等待某个条件的满足而暂停执行。
等待(Waiting):线程因为等待其他线程的通知而暂停执行。
计时等待(Timed Waiting):线程因为等待一个具体的时间而暂停执行。
终止(Terminated):线程执行完毕或者因异常退出。

7sleep() 和 wait() 有什么区别?
sleep()是Thread类的静态方法,让当前线程休眠一段时间,不释放锁;wait()是Object类的方法,让线程等待并释放锁。
sleep()在任何地方都可以使用,而wait()必须在同步块或同步方法中使用。

8notify()和 notifyAll()有什么区别?
notify()用于唤醒在此对象监视器上等待的单个线程,如果有多个线程在等待,则只会唤醒其中一个线程;
notifyAll()用于唤醒在此对象监视器上等待的所有线程。

9线程的 run()和 start()有什么区别?

run()方法是Thread类的普通方法,用于定义线程要执行的任务,直接调用时相当于普通方法的调用;
start()方法用于启动线程,使线程进入就绪状态,当获得CPU时间片时会调用run()方法执行任务。

10创建线程池有哪几种方式?
使用Executors工厂类中的newFixedThreadPool()、newCachedThreadPool()、newSingleThreadExecutor()等方法创建线程池;
使用ThreadPoolExecutor构造函数自定义线程池参数。

11线程池都有哪些状态?
RUNNING:线程池处于正常运行状态;
SHUTDOWN:线程池已关闭,不再接受新任务,但会执行已添加的任务;
STOP:线程池已关闭,并且不再执行已添加的任务;
TERMINATED:线程池已终止,所有的任务已完成。

12线程池中 submit()和 execute()方法有什么区别?
execute()方法用于执行实现了Runnable接口的任务,无法获取任务执行的结果或抛出的异常;
submit()方法用于执行实现了Callable接口的任务,并且可以获取任务执行的结果或抛出的异常。

13在 java 程序中怎么保证多线程的运行安全?
使用synchronized关键字对共享资源进行加锁;
使用Lock接口及其实现类对共享资源进行加锁;
使用原子类(Atomic类)来保证操作的原子性;
使用并发容器(如ConcurrentHashMap、CopyOnWriteArrayList等)来替代传统的集合类;
使用volatile关键字来保证共享变量的可见性。

14多线程锁的升级原理是什么?
synchronized关键字的底层实现会根据竞争情况自动升级为重量级锁。当多个线程竞争同一把锁时,JVM会将锁逐渐升级为偏向锁、
轻量级锁,最终升级为重量级锁,以确保多线程之间的互斥访问。

15 什么是死锁?
指两个或多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象,导致它们永远无法继续执行下去。

16 怎么防止死锁?
避免使用多个锁;
避免持有一个锁的同时等待另一个锁;
使用定时锁,避免无限等待;
避免循环等待。

17 ThreadLocal 是什么?有哪些使用场景?
是Java中的一个线程封闭机制,用于实现线程本地变量。它提供了一种线程私有的变量,每个线程都可以独立地改变自己的副本,
不会影响其他线程的副本。常见的使用场景包括数据库连接管理、Session管理、事务管理等。

18 说一下 synchronized 底层实现原理?
synchronized的底层实现原理是基于对象头中的Mark Word以及monitor对象实现的。当一个线程进入synchronized代码块时,
会尝试获取对象的monitor对象,如果获取成功则继续执行代码,如果获取失败则进入阻塞状态等待。当线程退出synchronized代码块时,会释放monitor对象。

19 synchronized 和 volatile 的区别是什么?
synchronized是一个重量级锁,可以保证原子性、可见性和有序性;volatile是一个轻量级的同步机制,只能保证可见性和有序性,不能保证原子性;
synchronized获取锁时会导致线程阻塞,而volatile不会导致线程阻塞;
synchronized可以用于修饰方法或代码块,而volatile只能用于修饰成员变量。

20 synchronized 和 Lock 有什么区别?
synchronized是Java中的关键字,Lock是一个接口;
synchronized是基于JVM实现的,Lock是基于Java代码实现的;
synchronized只支持非公平锁,Lock可以选择公平锁或非公平锁;
synchronized自动释放锁,Lock需要手动释放锁;
Lock提供了更多的功能,如可重入锁、超时锁等。

21 synchronized 和 ReentrantLock 区别是什么?
synchronized是Java内置的关键字,ReentrantLock是一个Java类;
synchronized是可重入锁,ReentrantLock也是可重入锁,并且支持公平锁和非公平锁;
synchronized不需要手动释放锁,ReentrantLock需要手动释放锁;
ReentrantLock提供了Condition接口,可以实现更加灵活的线程通信。

22 说一下 atomic 的原理?
Atomic类是Java中的原子操作类,可以保证对变量进行读取、修改、写入三个操作的原子性。Atomic类的原理是基于CAS(Compare And Swap)算法实现的,CAS算法包括三个操作数:内存值V、预期值A、新值B。当V和A相同时,才将V修改为B,
否则抛出异常。在实现中,Atomic类使用了CPU指令集提供的原子操作指令,保证了原子操作的高效性。
 

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

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

相关文章

Python通过telnet批量管理配置华为交换机

名称:Python通过telnet批量管理配置华为交换机 测试工具:ensp, Visual Studio Code , Python3.8环境 时间:2023.12.23 个人备注:在NB 项目中,可以批量登录修改交换机配置,以此满足甲方爸爸的…

Pytorch项目,肺癌检测项目之三

成功获取到数据之后,我们需要将数据放到Pytorch里面去处理,我们需要将其转换成Dataset数据集,方便去使用相同的API。要转换成Dataset数据集需要实现两个方法,方法一: 方法二: 运行比较慢的话&#xff0c…

【Linux基础开发工具】gcc/g++使用make/Makefile

目录 前言 gcc/g的使用 1. 语言的发展 1.1 语言和编译器自举的过程 1.2 程序翻译的过程: 2. 动静态库的理解 Linux项目自动化构建工具-make/makefile 1. 快速上手使用 2. makefile/make执行顺序的理解 前言 了解完vim编辑器的使用,接下来就可以尝…

servlet+thymeleaf改良版

servletthymeleaf改良版 一、maven坐标 <dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf</artifactId><version>3.0.12.RELEASE</version> <!-- 使用适当的Thymeleaf版本 --></dependency><dep…

网游逆向分析与插件开发-游戏反调试功能的实现-项目需求与需求拆解

上一个专栏结束位置&#xff1a;网游逆向分析与插件开发-代码保护壳的优化-修改随机基址为固定基址-CSDN博客 上一个专栏是做了一个壳有了一定的保护&#xff0c;但是保护还是不够&#xff0c;最大的保护是根上把问题解决了&#xff0c;就是我不允许你对我进行调试&#xff0c…

drawio绘制组织架构图和树形图

drawio绘制组织架构图和树形图 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能&#xff0c;并实现了云…

【一起学Rust | 框架篇 | Tauri2.0框架】Tauri2.0环境搭建与项目创建

文章目录 前言一、搭建 Tauri 2.0 开发环境二、创建 Tauri 2.0 项目1.创建项目2.安装依赖4. 编译运行 三、设置开发环境四、项目结构 前言 Tauri在Rust圈内成名已久&#xff0c;凭借Rust的可靠性&#xff0c;使用系统原生的Webview构建更小的App 以及开发人员可以灵活的使用各…

IDEA 中 Tomcat 日志乱码

1、服务器输出乱码 修改 File -> settings -> Editor -> General ->Console 中&#xff0c;utf-8改为GBK&#xff0c;反之改成utf-8 2、Tomcat Localhost Log 或者 Tomcat Catalina Log乱码 进入Tomcat 中的conf文件中的logging.properties 哪个有问题改哪个&…

虚拟机的下载、安装(模拟出服务器)

下载 vmware workstation&#xff08;收费的虚拟机&#xff09; 下载vbox 网址&#xff1a;Oracle VM VirtualBox&#xff08;免费的虚拟机&#xff09; 以下选择一个下载即可&#xff0c;建议下载vbox&#xff0c;因为是免费的。安装的时候默认下一步即可&#xff08;路径最好…

【数据安全】Java AES加密和解密

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

Kubernetes 架构原则和对象设计

什么是 Kubernetes Kubernetes 是谷歌开源的容器集群管理系统 • 基于容器的应用部署、维护和滚动升级&#xff1b; • 负载均衡和服务发现&#xff1b; • 跨机器和跨地区的集群调度&#xff1b; • 自动伸缩&#xff1b; • 无状态服务和有状态服务&#xff1b; • 插件机制…

fba海派和传统海运的区别,亚马逊 FBA货物包装技巧—站斧浏览器

fba海派和传统海运的区别 1、美国FBA海派是什么&#xff1f; 美国FBA海派即将商品通过海洋运输的方式运送到美国亚马逊FBA仓库的服务。这种方式主要适用于大批量或大件商品&#xff0c;因为相比其他物流方式&#xff0c;海派具备成本低和运载量大的优势。 2、传统海运是什么…

编译opencv和opencv_contrib

1 下载源码 下载opencv源码https://github.com/opencv/opencv 下载opencv源码https://github.com/opencv/opencv_contrib 2 开始编译 构建需要下载ffmpeg的包&#xff0c;cmake构建时会自动下载&#xff0c;但是比较满&#xff0c;这里可以从下面链接直接下载 https://downloa…

ECMAScript基础入门:从语法到应用

在此之前我以及发布过关于JavaScript基础知识点大家也可以参考 大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注…

C++ Qt开发:Charts折线图绘制详解

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍QCharts折线图的常用方法及灵活运用。 折线图…

C++ map和vector向量使用方法

C map用法 C 中 map 提供的是一种键值对容器&#xff0c;里面的数据都是成对出现的,如下图&#xff1a;每一对中的第一个值称之为关键字(key)&#xff0c;每个关键字只能在 map 中出现一次&#xff1b;第二个称之为该关键字的对应值。 map的使用 需要导入头文件 #include …

采用线性插值的方法 在n个坐标点的基础上 准备添加一个坐标点p 根据给出p的横坐标 计算出p的纵坐标 np.interp()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 采用线性插值的方法 在n个坐标点的基础上 准备添加一个坐标点p 根据给出p的横坐标 计算出p的纵坐标 np.interp() [太阳]选择题 下列选项正确的是&#xff1a; import numpy as np x np.arra…

[架构之路-264]:个性特征 - 到底什么才是工程师文化?

目录 前言&#xff1a; 一、三种类型的商业公司与生存法则 &#xff08;1&#xff09;运营或销售驱动型公司 &#xff08;2&#xff09;产品驱动型公司 &#xff08;3&#xff09;技术驱动型公司 二、工程师文化特征解读1 三、工程师文化特征解读2 &#xff08;1&#…

解决Unity物体速度过快无法进行碰撞检测(碰撞检测穿透)

解决Unity物体速度过快无法进行碰撞检测&#xff08;碰撞检测穿透&#xff09; 一、解决碰撞检测穿透方法一Collision Detection碰撞检测总结&#xff1a; 二、解决碰撞检测穿透方法二 一、解决碰撞检测穿透方法一 首先我们知道只要是跟碰撞相关的基本都是离不开刚体 Rigidbod…

八大排序算法@直接插入排序(C语言版本)

目录 直接插入排序概念算法思想代码实现核心算法&#xff1a;直接插入排序的算法实现&#xff1a; 特性总结 直接插入排序 概念 算法思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新…