1线程的创建方式

  • 继承Thread类
  • 实现Runnable接口
  • 实现Callable接口

2.这三种方式在项目中的使用有哪些,一般都是怎么用的

  1. 继承thread类实现线程的方式通过实现run方法来实现线程,通过run进行线程的启用
  2. 实现runnable方法实现run方法,然后通过thread类包装并启用
  3. 实现callable方法里的call方法,再由thread启动

3.他们各自的优缺点

  1. thread:实现简单,代码简洁,可以直接调用Thread类的方法,缺点是:单继承限制,灵活性较低,且没有返回值,无法获取线程的执行结果
  2. runnable:避免了单继承的限制,灵活性更高了,多个线程可以共享一个runnable,适合多线程操作共享资源,且runnable是一个函数接口,内存的开销更小,缺点:无返回值,异常都是在方法内部抛出,代码必须通过thread实现,代码不太友好
  3. callable:callable有返回值,外部可以通过future.get()获取异常,和runnable无单继承的限制,多个callable可以共享资源,缺点:使用复杂,需要通过futureTask或者线程池启动,用futureTak.get()方法会阻塞当前线程,直到线程结束,如果使用不当会导致性能问题,

4.技术的选型,三种分别应该怎么选

  • 简单任务且无需返回结果:优先用Runnable(避免单继承限制)。
  • 需要返回结果或处理异常:必须用Callable。
  • 极少情况下(如无需继承其他类且逻辑简单)才用继承Thread类。

5.线程池有哪些参数?

5个核心参数:核心线程数,最大线程数,空闲线程存活时间,阻塞任务队列,拒绝策略
线程存货时间单位,线程工厂

6.线程池的使用步骤

  1. 创建线程池对象,
  2. 实现线程
  3. 提交任务到线程池
  4. 关闭线程池

7.线程池有哪几种?它们分别对应什么队列?

  1. 固定大小线程池(核心线程数=最大线程数,空闲线程存活时间为0)=》无界队列
    特点:线程数量固定,不会动态增减,任务队列无界可以无限接收任务(可能OOM
  2. 单线程化线程池(核心线程数=最大线程数=1,空闲存活线程时间为0)=》无界队列
  3. 可缓存线程池=》同步队列
  4. 定时任务线程池=》延迟队列
  5. 单线程定时任务线程池=》延迟队列

无界队列:队列的容量没有上限,可以一直添加任务(注意若任务提交速度远快于处理速度,队列会无限膨胀,可能导致内存溢出(OOM))
同步队列:不存储任何任务,生产即消费,
延迟队列:队列任务中任务按照延迟时间排序,只有当任务的延迟时间到期后才能被取出执行,

8.什么时候触发最大线程条件?

核心线程全忙,队列全满,且最大线程数全满(无界队列不会触发最大线程)

9.线程池拒绝策略有哪些?默认是哪个?

  1. AbortPolicy(默认,抛出RejectedExecutionException异常,适用场景:不允许任务丢失,需要明确感知到任务提交失败的场景
  2. CallerRunsPolicy(让提交的线程自己执行改任务,而非线程池中的线程执行,适用场景:需要减缓任务提交的速度,起到自我限流的作用
  3. discardpolicy:默认丢弃新提交的任务,不抛异常,也不做任何处理,适用日志,非关键数据的统计上报
  4. discardOldestPolicy:丢弃队列中最旧的数据,腾出位置给新提交的任务,适用实时数据处理任务

10.什么是线程安全

解决共享资源的并发访问冲突,常见的手段是关键字synchronized,和加锁

11.如何判断一个类是否线程安全?

  1. 共享资源的并发访问冲突,
  2. 看线程是否有共享的资源(资源满足原子性,可见性,有序性则为线程安全),是否是共享的状态(有共享状态且持有成员变量,且这个变量可能被多个线程读写,则线程不安全)

12.线程不安全的根源是什么?请举例说明。

  1. 共享资源的非原子操作,具体来说就是,当共享资源被分为读取,修改,写入,三个操作不是原子性的时候,就有可能中间状态被其他线程修改导致数据不一致
  2. 例如ArrayList就是线程不安全的:底层是elementData动态数组,当执行add(),remove()方法的时候不是原子性的

13.线程安全的三大特性(原子性、可见性、有序性)分别指什么?

原子性:操作不可拆分,要么全部执行,要么全部不执行
可见性:一个线程修改共享资源后,其他线程可以立即看见最新的值
有序性:程序执行顺序符合预期(为提高性能jvm,cpu会对指令重排,在多线程环境下会影响线程之间的逻辑

14.ArrayList是否线程安全

底层是elementData动态数组,当执行add(),remove()方法的时候不是原子性的

add方法=》检查容量-扩容-元素赋值
remove方法=》查找元素-移动后续元素填补空位-修改size

15.使用什么集合可以做到线程安全

  1. 线程安全的用Vector,使用synchronized修改,线程安全了,但是性能低于ArrayList(尽量不用
  2. 使用collection.synchronizedList()将ArrayList包装为线程安全的集合(简单场景且并发量低的情况下使用)
  3. CopyOnWriteArrayList,是juc并发包提供的线程安全集合,当进行修改的操作的时候,会创建底层的数据副本,修改完成后再替换原数组,读操作无需加锁(适合读多写少的情况)

16.如何线程安全地操作ArrayList

  1. 使用collections.synchronizedList()包装修饰
  2. 使用copyonwriteArrayList()适合读多写少的情况,原理是采用读写分离,写操作有数组复制的开销,会造成内存占用的增加

17.ArrayList扩容机制

扩容依赖于两个变量,elementData,size,是按需扩容
当调用add()方法的时候添加元素的时候,初始elementData为空则会触发扩容,新容量为10,DEFAULT_CAPACITY默认值,然后每次到达上限的时候,扩充当前的1.5倍

18.HashMap、TreeMap、LinkedHashMap的区别?

hashMap:基于数组+链表/红黑树实现,无序插入,键可以允许插入null且只能一个;
treeMap:基于红黑树实现,按照键的自然顺序或者自定义比较器排序,键不允许为null
linkedMap:基于哈希表+双向链表实现,在hashMap的基础上通过双向链表记录元素顺序,即保留了hash表的查询效率又保证了有序性,键允许为null

19.什么是红黑树

是一种简单的自平衡二叉树,通过一套规则进行保证树的平衡,从而让各种操作都能更高效的,

两个核心特点:

  1. 节点非黑即红且根节点必须是黑色的,
  2. 从任意节点到叶子的所有路径黑色节点数量相等

20.他们各自适用的场景

hashmap:追求查询和修改的高效性,且不关心元素顺序(缓存,快速查询)
treeMap:需要对键进行排序或者范围查询(排行榜,区间统计场景)
linkedHashMap:需要保留插入顺序(日志记录),需要实现LRU缓存(缓存淘汰策略)

21.HashMap数据结构、哈希冲突解决方法

数据结构是基于数组+链表/红黑树实现,
当多个键哈希到同一个桶的时候会链表的形式存储这些键值对(解决哈希冲突
当链表过长时默认长度>8自动转为红黑树,当红黑树的节点数少于6的时候会自动转为链表

22.什么是哈希算法

把任意长度的输入通过散列算法变为固定长度的输出,hash表又是散列表

23.HashMap为什么线程不安全?如何线程安全地操作?

并发操作时可能导致数据不一致或结构破坏
hashmap多个线程同时进行put操作的会出现数据覆盖的情况,导致数据的丢失

想要安全的操作线程可以使用concourrentHashMap,或者使用手动加锁,collection.synchronizedMap, 手动加锁并发效率低,会有性能问题,concurrentHashMap则是转为高并发设计的

24.HashMap扩容的原理

判断是否扩容的依据是元素数量>=阈值
分为两个阶段
1.计算新容量
2.迁移元素

25.Shiro怎么根据url对应权限,流程是什么?

1.请求拦截
2.匹配URL对的权限规则
3.检验用户是否有该权限(通过dogetAuthorizationInfo获取)
4.允许或者拒绝访问

26.怎么结合redis存储权限,提高性能的

一:
1.缓存用户的所有权限,避免每次权限校验的时候都查询数据库
2.缓存url与对应权限的对应关系,减少动态解析URL规则开销
3.缓存角色与权限的映射关系,加速权限继承关系的计算

27.session存放在哪里?

1.shiro默认把session存放在jvm中,— 缺点是集群环境下会话不共享,节点切换的时候需要重新登录
重启后session丢失,用户需要重新登录
内存容量有限用户过多的情况下会oom
2.采用redis存储,好处解决了会话共享和持久化,

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

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

相关文章

站在前端的角度,看鸿蒙页面布局

从Web前端转向鸿蒙(HarmonyOS)开发时,理解其页面布局的相似与差异是快速上手的核心。鸿蒙的ArkUI框架在布局理念上与Web前端有诸多相通之处,但也存在关键区别。以下从五个维度系统分析: 📦 一、盒子模型&a…

JavaWeb遗传算法、TSP、模拟退火、ACO算法等实战应用

Java Web中实现遗传算法的应用 以下是关于Java Web中实现遗传算法的应用场景和实例的整理,涵盖不同领域的解决方案和实现方法: 遗传算法基础结构 在Java Web中实现遗传算法通常需要以下核心组件: 种群初始化:随机生成初始解集。 适应度函数:评估个体优劣。 选择操作:轮…

【图像算法 - 09】基于深度学习的烟雾检测:从算法原理到工程实现,完整实战指南

一、项目背景与需求 视频介绍 【图像算法 - 09】基于深度学习的烟雾检测:从算法原理到工程实现,完整实战指南今天我们使用深度学习来训练一个烟雾明火检测系统。这次我们使用了大概一万五千张图片的数据集训练了这次的基于深度学习的烟雾明火检测模型&a…

间接制冷技术概念及特征

1、基本概念 (1)间接制冷技术即二次制冷技术。常规做法:二次冷却液储液罐增加放置于制冷系统管路,促使冷量再快捷的传递给载冷剂,继而载冷剂冷量促使冷库达到制冷效果。间接制冷技术:通过常压的二次冷却介质进行大循环传送冷量,在直接制冷剂不易应用的位置或者不可运用直…

Antlr学习笔记 01、maven配置Antlr4插件案例Demo

文章目录前言源码插件描述pom引入插件案例:实现hello 标识符 案例1、引入Antlr4的pom运行依赖2、定义语义语法,配置.g4文件实现java代码3、编写完之后,执行命令实现编译4、编写单测测试使用参考文章资料获取前言 博主介绍:✌目前…

PostGIS面试题及详细答案120道之 (101-110 )

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

第十七天:原码、反码、补码与位运算

原码、反码、补码与位运算 一、原码、反码、补码 1、原码 定义:原码是一种简单的机器数表示法。对于一个有符号整数,最高位为符号位, 0 表示正数, 1 表示负数,其余位表示数值的绝对值。示例:以 8 位二进制…

一次完整的 Docker 启动失败排错之旅:从 `start-limit` 到 `network not found

一次完整的 Docker 启动失败排错之旅:从 start-limit 到 network not found 你是否也曾自信地敲下 sudo systemctl start docker,却只得到一个冰冷的 failed?这是一个开发者和运维工程师都可能遇到的场景。本文将通过一个真实的排错案例&…

Tdengine 时序库年月日小时分组汇总问题

年月分组select to_char(collection_time ,"yyyy-mm") AS date, cast(SUM(a.stage_value)as DOUBLE) as stage_value from TABLE GROUP BY date年月日分组select to_char(collection_time ,"yyyy-mm-dd") AS date, SUM(a.stage_value)as DOUBLE) as stage_…

数据结构(01)—— 数据结构的基本概念

408前置学习C语言基础也可以看如下专栏:打怪升级之路——C语言之路_ankleless的博客-CSDN博客 目录 1. 基本概念 1.1 数据 1.2 数据元素 1.3 数据项 1.4 组合项 1.5 数据对象 1.6 数据类型 2. 数据结构 2.1 逻辑结构 2.2 存储结构 2.3 数据的运算 在学…

什么是模型并行?

模型并行c 简单来说,就是把一个模型拆开来放到多个 GPU 上,一起训练,从而化解“显存塞不下模型”的问题!更多专业课程内容可以听取工信部电子标准院《人工智能大模型应用工程师》课程获得详解!

跑yolov5的train.py时,ImportError: Failed to initialize: Bad git executable.

遇到的问题&#xff1a; Traceback (most recent call last):File "D:\miniconda\envs\yolov5\lib\site-packages\git\__init__.py", line 296, in <module>refresh()File "D:\miniconda\envs\yolov5\lib\site-packages\git\__init__.py", line 287…

TCP如何实现可靠传输?实现细节?

TCP如何实现可靠传输&#xff1f;实现细节&#xff1f;如何实现可靠传输&#xff1f;拥塞控制的主要机制TCP流量控制怎么实现的&#xff1f;如何实现可靠传输&#xff1f; TCP通过自身的序列号、确认应答、数据效验、超时重传、流量控制、拥塞避免&#xff0c;确保了数据传输的…

Linux 服务器性能监控、分析与优化全指南

Linux 服务器性能监控、分析与优化在现代 IT 架构中&#xff0c;Linux 服务器作为承载业务系统的核心载体&#xff0c;其性能表现直接决定了服务的稳定性、响应速度与用户体验。无论是高并发的 Web 服务、数据密集型的数据库集群&#xff0c;还是承载虚拟化平台的宿主机&#x…

基于wenet和模型做企业直播敏感语音屏蔽技术

本文介绍了基于Wenet语音识别工具包的实时敏感词屏蔽技术方案。该方案通过客户端缓存25秒直播内容&#xff0c;利用Wenet的流式识别和断句检测功能&#xff0c;实时检测讲师语音中的敏感词&#xff0c;并将对应位置的语音替换为"哔"声。文章详细阐述了Wenet的两种识别…

42.MySQL视图

1.一个需求emp 表的列信息很多&#xff0c;有些信息是个人重要信息 (比如 sal, comm, mgr, hiredate)&#xff0c;如果我们希望某个用户只能查询 emp 表的 (empno、ename, job 和 deptno ) 信息&#xff0c;有什么办法&#xff1f;表的数据&#xff1a;想让用户查询到的&#x…

MinIO01-入门

零、文章目录 MinIO01-入门 1、介绍 &#xff08;1&#xff09;介绍 MinIO 是一款基于 Apache License v2.0 的开源对象存储系统&#xff0c;专为海量非结构化数据&#xff08;如图片、视频、日志文件等&#xff09;设计&#xff0c;兼容 Amazon S3 API&#xff0c;支持高性…

*Docker数据卷(Volume)核心机制剖析:持久化与共享的终极解决方案

根本问题当容器被删除时&#xff0c;其内部产生的所有文件&#xff08;包括配置文件、数据库、日志&#xff09;都会不可逆丢失。数据卷&#xff08;Volume&#xff09;通过外置存储方案彻底解决此痛点。一、数据卷与普通容器存储对比实验 场景1&#xff1a;无卷模式下的写入悲…

原型模式在C++中的实现与面向对象设计原则

引言 在软件开发中&#xff0c;原型模式是一种常用的设计模式&#xff0c;主要用于创建对象的克隆。通过原型模式&#xff0c;我们可以避免复杂的对象创建过程&#xff0c;尤其是当对象的初始化需要大量资源或复杂操作时。本文将通过一个具体的例子&#xff0c;详细介绍如何在C…

SpringCloud学习------Gateway详解

在微服务架构中&#xff0c;随着服务数量的激增&#xff0c;如何统一管理服务入口、实现请求路由、保障服务安全等问题日益突出。SpringCloud Gateway 作为 Spring 官方推出的网关组件&#xff0c;凭借其强大的功Gateway 是 Spring 官方基于 Spring、SpringBoot 和 Project Rea…