java多线程面试集合(1)

1.并行和并发的区别

操作系统角度,线程是最小的执行单位

  • 并行同一时刻两个线程都在执行,这就要求要有两个cpu。
  • 并发就是 同一时刻,只有一个执行但是在一个时间段内,两个线程都执行了,并发依赖于CPU切换线程,因为线程切换时间极短,所以用户无感。

2.什么是进程和线程

一个进程包含了多个线程,多个线程共用堆和方法区资源,但是每个线程有自己的计数器和栈。
看线程基本知识,描述了两者区别

3.线程创建的方式

线程创建有3种方式,继承Thread类,实现Runnable接口,Callable接口(又返回值)

4.为什么调用start()方法时会执行run()方法,那怎么不直接调用run()方法?

因为jvm执行start方法时候,会先创建一条线程,由创建的线程去调用thread类的run方法,起到多线程效果,如果直接执行run方法,那么相当于还是运行在主线程中,起不到多线程作用了。

5.线程有哪些常用的方法

  1. 等待:wait()、wait(long timeout)、wait(long timeout,int nanos),join()
  2. 通知: notify()、notifyAll()
  3. 中断:interrupt(),isinterruputed()、interrupted()(检测是否中断,如果被中断,则会清楚标志)
  4. 让出优先权:yoeld()
  5. 休眠:sleep()

5.线程的几种状态

共六种状态

  1. new新建
  2. runnable运行就绪
  3. blocked阻塞
  4. waiting 等待
  5. timed_waiting 超时等待
  6. terminated死亡

6.什么是线程上下文切换

为了让用户感觉多个线程是在同时执行的, CPU 资源的分配采用了时间片轮转也就是给每个线程分配一个时间片,
线程在时间片内占用 CPU 执行任务。当线程使用完时间片后,就会处于就绪状态并让出 CPU 让其他线程占用,这
就是上下文切换。

7.守护线程了解吗?

Java中的线程分为两类,分别为 daemon 线程(守护线程)和 user 线程(用户线程)。
在JVM 启动时会调用 main 函数,main函数所在的线程就是一个用户线程。其实在 JVM 内部同时还启动了很多守护
线程, 比如垃圾回收线程。
那么守护线程和用户线程有什么区别呢?区别之一是当最后一个非守护线程束时, JVM会正常退出,而不管当前是否
存在守护线程,也就是说守护线程

8.线程有那些通信方式

在这里插入图片描述

9.ThreadLocal是什么

TheadLocal是一个线程本地变量,如果你创建了一个ThreadLocal变量,那么访问这些变量的每个线程都会有这一个变量的本地拷贝,多个线程操作变量时候,实际操作的是自己本地内存里面的变量,从而起到线程隔离的作用,避免了线程的安全问题。
在这里插入图片描述

1.创建一个ThreadLocal线程变量
public static ThreadLocal<String> localVabile = new ThreadLocal<>();
2.写入
localVabile.set("共享资源";
3.读取,在任何一个地方读取的都是他写入的变量
localVabile.get()


10.在工作中如何使用的ThreadLocal

  • 用来做用户的上下文的存储。
  • 常用的数据库连接池,交给ThreadLocal进行管理,保障当前线程的操作都是同一个Connection。

11.ThreadLocal如何实现

查看ThreadLocal的set方法,发现是先获取当前的线程,在获取TheadLocalMap,然后再把这个元素放到map中

public void set(T value){
			//获取当前线程
			Thread t = Thread.currentThread();
			//获取ThreadLocalMap
			ThreadLocalMap map = getMap(t);
			//将当前元素存入
			if(map !=null){
			map。set(this,value);
}else{
createMap(t,value)
}

ThreadLocal实现的秘密都在这个 ThreadLocalMap了,
实现原理:

  • Thread类有一个类型为ThreadLocal.ThreadLocalMap的实例变量threadLocals,每个线程都有一个属于自己的ThreadLocalMap。
  • TheadLocalMap内部维护着Entry数组,每个Entry代表一个完整的对象,key是弱引用的作用,value是每个ThreadLocal的泛型
  • 每个线程在往里面设置值的时候,都是往自己的ThreadLocalMap里存,读也是以某个ThreadLocal作为引用值,在自己的map里面找对应的值,从而实现了线程隔离。ThreadLocal本身不存值,它只是作为一个key来人线程往里面存取值。

12. ThreadLocal的内存泄漏

在jvm中,栈内存私有,存储了对象的引用,堆内存线程共享,存储了对象实例

ThreadLocalMap中使用的 key 为 ThreadLocal 的弱引用。
“弱引用:只要垃圾回收机制一运行,不管JVM的内存空间是否充足,都会回收该对象占用的内存。”
那么现在问题就来了,弱引用很容易被回收,如果ThreadLocal(ThreadLocalMap的Key)被垃圾回收器回收了,但
是ThreadLocalMap生命周期和Thread是一样的,它这时候如果不被回收,就会出现这种情况: ThreadLocalMap的
key没了,value还在,这就会造成了内存泄漏问题。使用完ThreadLocal后及时调用remove()方法释放空间。

key设计成弱引用同样是为了防止内存泄漏。
假如key被设计成强引用,如果ThreadLocal Reference被销毁,此时它指向ThreadLoca的强引用就没有了,但是此时key
还强引用指向ThreadLoca,就会导致ThreadLocal不能被回收,这时候就发生了内存泄漏的问题。

13.ThreadLocalMap了解吗

ThreadLocalMap虽然被叫做map,但是它没有实现Map接口,但是结构还是和HashMap类似的,主要就是关注的是两个元素:元素数组和散列方法

  • 元素数组:一个table数组,存储Entry类型的元素,Entry是ThreadLocal弱引用的作为key,Object作为value的结构。
  • 散列方法:散列方法就是把对应的key映射到table数组的相应下标,ThreadLocalMap用的是哈希取余法,取出key的threadLocalHashcode,然后和table数组长度减一一起计算
int i = key.threadLocalHashCode & (table.length - 1);

ThreadLocalmap

14.TheadLocalMap怎么解决Hash冲突的

我们都知道hashmap使用了链表来解决冲突,也就是所谓的链地址法。
ThreadLocalMap则是使用的是开放定址法,简单来说就是这个坑被人占了,那就接着找个空着的坑

15.ThreadLocalMap的扩容机制

在这里插入图片描述

16.父子线程怎么共享数据?

父线程不能使用TheadLocal来给子线程进行值传递,这个时候使用另一个类InheritableThreadLocal,再主线程的InheritablThreadLocal实例设置值,在子线程中就可以拿到

public class InheritableThreadLocalTest {
public static void main(String[] args) {
final ThreadLocal threadLocal = new InheritableThreadLocal();
// 主线程
threadLocal.set("不 技术");
//子线程
Thread t = new Thread() {
@Override
public void run()
{ super.run();
System.out.println(" 人三某 ," +
threadLocal.get());
}
};
t.start();
}
}
那原理是什么呢?
原理很简单,在Thread类里还有另外一个变量:
ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
在Thread.init的时候,如果父线程的 inheritableThreadLocals 不为空,就把它赋给当前线程(子线程)的
inheritableThreadLocals 。
if (inheritThreadLocals && parent.inheritableThreadLocals != null)
this.inheritableThreadLocals =
ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);

ps:给我一个一键三连加加油呢

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20240112-【UNITY 学习】实现第一人称移动教程

1、创建一个空物体&#xff0c;挂载Rigidbody组件&#xff0c;并设置相应参数 2、在上述空物体下创建一个胶囊体&#xff0c;两个空物体&#xff0c;一个用来控制朝向&#xff0c;另一个用来控制摄像机 3、给摄像机创建一个父物体&#xff0c;并挂载脚本MoveCamera_01.cs using…

YOLOv8改进 更换层次化视觉变换器的网络结构

一、SwinTransformer论文 论文地址:arxiv.org/pdf/2103.14030.pdf 二、 SwinTransformer网络结构 SwinTransformer是一种基于transformer的图像分类网络结构。SwinTransformer是由微软亚洲研究院提出的,其特点是具有高效的计算和参数效率。 SwinTransformer的网络结构主要…

java每日一题——打印100以内个位和十位相同,尾数为1,3,5,7的数字

前言&#xff1a; 打好基础&#xff0c;daydayup! 题目&#xff1a;打印100以内个位和十位相同&#xff0c;尾数为1,3,5,7的数字 思路&#xff1a;1&#xff0c;个位通过对10求余数可求出1&#xff0c;3&#xff0c;5&#xff0c;7&#xff1b; 2&#xff0c;十位可通过先除10…

主流浏览器设置代理IP之Firefox浏览器

给浏览器设置代理IP是目前代理IP的主流使用场景之一&#xff0c;接下来小编就手把手教你如何对Firefox浏览器进行代理IP设置 注&#xff1a;本次使用IP来源于携趣代理平台https://www.xiequ.cn/index.html?4c51b56bhttps://www.xiequ.cn/index.html?4c51b56bFirefox浏览器内…

Java多线程并发篇----第九篇

系列文章目录 文章目录 系列文章目录前言一、阻塞状态(BLOCKED)二、线程死亡(DEAD)三、终止线程 4 种方式前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、…

ERROR in Plugin “react“ was conflicted .... 天坑留念-turborepo、eslint plugin

前两天项目代码拉下来&#xff0c;装完依赖启动的时候直接报错&#xff1a; [eslint] Plugin "react" was conflicted between ".eslintrc.js eslint-config-custom eslint-config-alloy/react" and "BaseConfig D:\pan\erp\test\business-servic…

矿泉水除硝酸盐的关键技术

在全球工业化和城市化的加速推进下&#xff0c;饮用水安全问题已经成为公众关注的焦点。在众多的水质污染物中&#xff0c;硝酸盐因其对健康的潜在危害而备受关注。为了确保饮用水的安全&#xff0c;去除水中的硝酸盐至关重要。本文将重点介绍离子交换树脂工艺在饮用水硝酸盐去…

学习C指针

指针基本介绍 计算机中的每个内存都有地址 整型分配4字节&#xff0c;字符分配1字节 &#xff0c;浮点数分配4字节 指针是一个变量&#xff0c;它存放着另外一个变量的地址 int a; int *p; p &a;// a 5; printf(p) //get a address print &a //get a address …

黑马苍穹外卖学习Day5

文章目录 Redis学习Redis简介准备工作Redis常用数据类型介绍各数据类型的特点Redis常用命令字符串操作命令哈希操作命令列表操作命令集合操作命令有序集合操作命令通用操作命令 在Java中操作Redis导入Spring Data Redis坐标配置Redis数据源编写配置类&#xff0c;创建RedisTemp…

Golang基础入门及Gin入门教程(2024完整版)

Golang是Google公司2009年11月正式对外公开的一门编程语言&#xff0c;它不仅拥有静态编译语言的安全和高性能&#xff0c;而 且又达到了动态语言开发速度和易维护性。有人形容Go语言&#xff1a;Go C Python , 说明Go语言既有C语言程序的运行速度&#xff0c;又能达到Python…

【贪心】一手顺子

/** 贪心&#xff1a;将一个数当成一个组中最小的数&#xff0c;在根据该最小数找其它数。* 思路&#xff1a;将hand进行分组&#xff0c;假设hand长度为 n&#xff0c;必须n % groupSize 0才可以分组&#xff0c;否则返回false&#xff0c;* 使用哈希表记录每个数出现…

ffmpeg命令增加headers参数解决http请求ts返回404 not found问题的解决方法:-headers、-an

最近项目上遇到一个问题&#xff0c;用ffmpeg请求录制一个m3u8的实时流成为mp4文件的时候&#xff0c;命令返回404错误&#xff1a; 但是有一个很奇怪的现象&#xff0c;就是ffmpeg请求不到的&#xff0c;VLC却能正常播放&#xff0c;对比一下抓包&#xff1a; 那么既然就差别…

用机器学习方法来预测设备故障

最近做了一个项目&#xff0c;根据设备的状态&#xff0c;来判断设备是否有故障&#xff0c;这里总结一下所用到的数据探索&#xff0c;特征工程以及机器学习模型等方法。考虑到项目数据的敏感性&#xff0c;这里我以网上找到的一个公开数据集UCI Machine Learning Repository作…

基于STM32的温室大棚环境检测及自动浇灌系统设计

需要全部资料请私信我&#xff01; 基于STM32的温室大棚环境检测及自动浇灌系统设计 一、绪论1.1 研究背景及意义1.2 研究内容1.3 功能设计 二、系统方案设计2.1 总体方案设计 三、系统硬件设计3.1 STM32单片机最小系统3.2 环境温度检测电路设计3.3 土壤湿度检测电路设计3.4 光…

FineBI实战项目一(23):订单商品分类词云图分析开发

点击新建组件&#xff0c;创建订单商品分类词云图组件。 选择词云&#xff0c;拖拽catName到颜色和文本&#xff0c;拖拽cat到大小。 将组件拖拽到仪表板。 结果如下&#xff1a;

企业微信forMAC,如何左右翻动预览图片

1、control commandshifd 进入企业微信的debug调试模式 2、按照如下步骤选择 3、重启企业微信

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -我参与的投票列表实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

欧洲高性能计算联合企业豪掷2000万欧元采购量子计算机

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨琳梦 深度好文&#xff1a;945字丨8分钟阅读 近日&#xff0c;欧洲高性能计算联合企业&#xff08;EuroHPC JU&#xff09;启动了一项重要计划&#xff0c;旨在显著提…

MOOSE相关滤波跟踪算法(个人学习笔记)

MOOSE 论文标题 “Visual Object Tracking using Adaptive Correlation Filters” 原文地址 用滤波器对目标外观进行建模&#xff0c;并通过卷积操作来执行跟踪。 参考阅读&#xff1a; 目标跟踪经典算法——MOSSE&#xff08;Minimum Output Sum Square Error&#xff09…

电容的基础知识

一、电容单位 电容亦称作“电容量”&#xff0c;是指在给定电位差下的电荷储藏量&#xff0c;记为C&#xff0c;国际单位是法拉&#xff08;F&#xff09;。在国际单位制里&#xff0c;电容的单位是法拉&#xff0c;简称法&#xff0c;符号是F&#xff0c;由于法拉这个单位太大…
最新文章