Java面试题(每天10题)-------连载(26)
目录
多线程篇
1、什么是FutureTask?
2、什么是同步容器和并发容器的实现?
3、什么是多线程的上下文切换?
4、ThreadLocal的设计理念与作用?
5、ThreadPool(线程池)用法与优势?
6、Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。
7、synchronized和ReentrantLock的区别?
8、Java Concurrency API中的Lock接口(Lock interface)是什么?对比同步它有什么优势?
9、Hashtable的size()⽅法中明明只有⼀条语句”return count”,为什么还要做同步?
10、ConcurrentHashMap的并发度是什么?
多线程篇
1、什么是FutureTask?
1 、 FutureTask可⽤于异步获取执⾏结果或取消执⾏任务的场景 。通过传⼊ Runnable 或者 Callable 的任务给 FutureTask ,直接调⽤其run ⽅法或者放⼊线程池执⾏,之后可以在外部通过 FutureTask 的 get ⽅法异步获取执⾏结果,因此,FutureTask⾮常适合⽤于耗时的计算,主线程可以在完成⾃⼰的任务后,再去获取结果。另外, FutureTask 还可以确保即使调⽤了多次run ⽅法,它都只会执⾏⼀次 Runnable 或者 Callable 任务,或者通过 cancel 取消 FutureTask 的执⾏等。2 、 futuretask 可⽤于执⾏多任务、以及避免⾼并发情况下多次创建数据机锁的出现。
2、什么是同步容器和并发容器的实现?
1 、同步容器
- 主要代表有Vector和Hashtable,以及Collections.synchronizedXxx等。
- 锁的粒度为当前对象整体。
- 迭代器是及时失败的,即在迭代的过程中发现被修改,就会抛出ConcurrentModificationException。
2 、并发容器
- 主要代表有ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentSkipListMap、ConcurrentSkipListSet。
- 锁的粒度是分散的、细粒度的,即读和写是使⽤不同的锁。
- 迭代器具有弱⼀致性,即可以容忍并发修改,不会抛出ConcurrentModificationException。
3、什么是多线程的上下文切换?
1 、多线程:是指从软件或者硬件上实现多个线程的并发技术。2 、多线程的好处:
- 使⽤多线程可以把程序中占据时间⻓的任务放到后台去处理,如图⽚、视屏的下载
- 发挥多核处理器的优势,并发执⾏让系统运⾏的更快、更流畅,⽤户体验更好
3 、多线程的缺点:
- ⼤量的线程降低代码的可读性;
- 更多的线程需要更多的内存空间
- 当多个线程对同⼀个资源出现争夺时候要注意线程安全的问题。
4 、多线程的上下⽂切换:CPU 通过时间⽚分配算法来循环执⾏任务,当前任务执⾏⼀个时间⽚后会切换到下⼀个任务。但是,在切换前会保存上⼀个任务的状态,以便下次切换回这个任务时,可以再次加载这个任务的状态
4、ThreadLocal的设计理念与作用?
1、概念:线程局部变量。在并发编程的时候,成员变量如果不做任何处理其实是线程不安全的,各个线程都在操作同⼀个变量,显然是不⾏的,并且我们也知道volatile这个关键字也是不能保证线程安全的。那么在有⼀种情况之下,我们需要满⾜这样⼀个条件:变量是同⼀个,但是每个线程都使⽤同⼀个初始值,也就是使⽤同⼀个变量的⼀个新的副本。这种情况之下ThreadLocal就⾮常适⽤,⽐如说DAO的数据库连接,我们知道DAO是单例的,那么他的属性Connection就不是⼀个线程安全的变量。⽽我们每个线程都需要使⽤他,并且各⾃使⽤各⾃的。这种情况,ThreadLocal就⽐较好的解决了这个问题。
2 、原理:从本质来讲,就是每个线程都维护了⼀个 map ,⽽这个 map 的 key 就是 threadLocal ,⽽值就是我们 set 的那个值,每次线程在get 的时候,都从⾃⼰的变量中取值,既然从⾃⼰的变量中取值,那肯定就不存在线程安全问题,总体来讲, ThreadLocal 这个变量的状态根本没有发⽣变化,他仅仅是充当⼀个key 的⻆⾊,另外提供给每⼀个线程⼀个初始值。3 、 实现机制:每个Thread对象内部都维护了⼀个ThreadLocalMap这样⼀个ThreadLocal的Map,可以存放若⼲个ThreadLocal。/* ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal class. */ ThreadLocal.ThreadLocalMap threadLocals = null;
4 、应⽤场景:当很多线程需要多次使⽤同⼀个对象,并且需要该对象具有相同初始化值的时候最适合使⽤ ThreadLocal 。
5、ThreadPool(线程池)用法与优势?
1 、 ThreadPool 优点
- 减少了创建和销毁线程的次数,每个⼯作线程都可以被重复利⽤,可执⾏多个任务
- 可以根据系统的承受能⼒,调整线程池中⼯作线线程的数⽬,防⽌因为因为消耗过多的内存,⽽把服务器累趴下(每个线程需要⼤约1MB内存,线程开的越多,消耗的内存也就越⼤,最后死机)
- 减少在创建和销毁线程上所花的时间以及系统资源的开销
- 如不使⽤线程池,有可能造成系统创建⼤量线程⽽导致消耗完系统内存
2 、⽐较重要的⼏个类:
类 描述 ExecutorService 真正的线程池接口 ScheduledExecutorService 能和Timer/TimerTask类似,解决那些需要任务重复执行的问题 ThreadPoolExecutor ExecutorService的默认实现 ScheduledThreadPoolExecutor 继承ThreadPoolExecutor的ScheduldExecutorService接口实现,周期性任务调度的类实现
3、任务执行顺序
i. 当线程数⼩于 corePoolSize 时,创建线程执⾏任务。ii. 当线程数⼤于等于 corePoolSize 并且 workQueue 没有满时,放⼊ workQueue 中iii. 线程数⼤于等于 corePoolSize 并且当 workQueue 满时,新任务新建线程运⾏,线程总数要⼩于 maximumPoolSizeiv. 当线程总数等于 maximumPoolSize 并且 workQueue 满了的时候执⾏ handler 的 rejectedExecution 。也就是拒绝策略。
6、Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。
1 、 ArrayBlockingQueue 数组结构组成的有界阻塞队列:2、CountDownLatch 允许⼀个或多个线程等待其他线程完成操作;
7、synchronized和ReentrantLock的区别?
1 、基础知识
- 可重⼊锁。可重⼊锁是指同⼀个线程可以多次获取同⼀把锁。ReentrantLock和synchronized都是可重⼊锁。
- 可中断锁。可中断锁是指线程尝试获取锁的过程中,是否可以响应中断。synchronized是不可中断锁,⽽ReentrantLock则提供了中断功能。
- 公平锁与⾮公平锁。公平锁是指多个线程同时尝试获取同⼀把锁时,获取锁的顺序按照线程达到的顺序,⽽⾮公平锁则允许线程“插队”。synchronized是⾮公平锁,⽽ReentrantLock的默认实现是⾮公平锁,但是也可以设置为公平锁。
- CAS操作(CompareAndSwap)。CAS操作简单的说就是⽐较并交换。CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会⾃动将该位置值更新为新值。否则,处理器不做任何操作。⽆论哪种情况,它都会在 CAS 指令之前返回该位置的值。CAS 有效地说明了“我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。”
2 、 Synchronizedi. synchronized 是 java 内置的关键字,它提供了⼀种独占的加锁⽅式。 synchronized 的获取和释放锁由 JVM 实现,⽤户不需要显示的释放锁,⾮常⽅便。然⽽synchronized 也有⼀定的局限性:
- 当线程尝试获取锁的时候,如果获取不到锁会⼀直阻塞。
- 如果获取锁的线程进⼊休眠或者阻塞,除⾮当前线程异常,否则其他线程尝试获取锁必须⼀直等待。
3 、 ReentrantLocki. ReentrantLock 它是 JDK 1.5 之后提供的 API 层⾯的互斥锁,需要 lock ()和 unlock ()⽅法配合 try/finally 语句块来完成。ii. 等待可中断避免,出现死锁的情况(如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true ,如果等待超时,返回 false )iii. 公平锁与⾮公平锁多个线程等待同⼀个锁时,必须按照申请锁的时间顺序获得锁, Synchronized 锁⾮公平锁,ReentrantLock默认的构造函数是创建的⾮公平锁,可以通过参数 true 设为公平锁,但公平锁表现的性能不是很好。
8、Java Concurrency API中的Lock接口(Lock interface)是什么?对比同步它有什么优势?
1 、 Lock 接⼝⽐同步⽅法和同步块提供了更具扩展性的锁操作。他们允许更灵活的结构,可以具有完全不同的性质,并且可以⽀持多个相关类的条件对象。2 、它的优势有:
- 可以使锁更公平
- 可以使线程在等待锁的时候响应中断
- 可以让线程尝试获取锁,并在⽆法获取锁的时候⽴即返回或者等待⼀段时间
- 可以在不同的范围,以不同的顺序获取和释放锁
9、Hashtable的size()⽅法中明明只有⼀条语句”return count”,为什么还要做同步?
1、有问题了,可能线程 A 在执⾏ Hashtable 的 put ⽅法添加数据,线程 B 则可以正常调⽤ size ()⽅法读取 Hashtable 中当前元素的个数,那读取到的值可能不是最新的,可能线程A 添加了完了数据,但是没有对 size++ ,线程 B 就已经读取 size 了,那么对于线程B 来说读取到的 size ⼀定是不准确的。2 、⽽给 size ()⽅法加了同步之后,意味着线程 B 调⽤ size ()⽅法只有在线程 A 调⽤ put ⽅法完毕之后才可以调⽤,这样就保证了线程安全性。
10、ConcurrentHashMap的并发度是什么?
1、⼯作机制(分⽚思想):它引⼊了⼀个 “分段锁” 的概念,具体可以理解为把⼀个⼤的 Map 拆分成 N 个⼩的 segment ,根据key.hashCode ()来决定把 key 放到哪个 HashTable 中。可以提供相同的线程安全,但是效率提升 N 倍,默认提升 16 倍。2 、应⽤:当读 > 写时使⽤,适合做缓存,在程序启动时初始化,之后可以被多个线程访问;3 、 hash 冲突:
- 简介:HashMap中调⽤hashCode()⽅法来计算hashCode。由于在Java中两个不同的对象可能有⼀样的hashCode,所以不同的键可能有⼀样hashCode,从⽽导致冲突的产⽣。
- hash冲突解决:使⽤平衡树来代替链表,当同⼀hash中的元素数量超过特定的值便会由链表切换到平衡树
4 、⽆锁读: ConcurrentHashMap 之所以有较好的并发性是因为 ConcurrentHashMap 是⽆锁读和加锁写,并且利⽤了分段锁(不是在所有的entry 上加锁,⽽是在⼀部分 entry 上加锁);
读之前会先判断 count ( jdk1.6 ),其中的 count 是被 volatile 修饰的(当变量被 volatile 修饰后,每次更改该变量的时候会将更改结果写到系统主内存中,利⽤多处理器的缓存⼀致性,其他处理器会发现⾃⼰的缓存⾏对应的内存地址被修改,就会将⾃⼰处理器的缓存⾏设置为失效,并强制从系统主内存获取最新的数据。),故可以实现⽆锁读。5 、 ConcurrentHashMap 的并发度就是 segment 的⼤⼩,默认为 16 ,这意味着最多同时可以有 16 条线程操作ConcurrentHashMap,这也是 ConcurrentHashMap 对 Hashtable 的最⼤优势。
相关文章:

Java面试题(每天10题)-------连载(26)
目录 多线程篇 1、什么是FutureTask? 2、什么是同步容器和并发容器的实现? 3、什么是多线程的上下文切换? 4、ThreadLocal的设计理念与作用? 5、ThreadPool(线程池)用法与优势? 6、Concur…...

通用型 SPI-Flash 相关知识汇总(w25q16\q64,gd25q128\q256)
目录 管脚定义: 常用指令: GD25q16: gd25Q28 编辑 gw25q16 编辑 芯片丝印说明: GD系列: winbond系列: Read Identification(9FH): 常见ID: GD: 编辑…...

鸿蒙原生应用开发-DevEco Studio超级终端模拟器的使用
一、了解超级终端模拟器支持的设备情况 该特性在DevEco Studio V2.1 Release及更高版本中支持。 目前超级终端模拟器支持“PhonePhone”、“PhoneTablet”和“PhoneTV”的设备组网方式,开发者可以使用该超级终端模拟器来调测具备跨设备特性的应用/服务,如…...

抖音AAN服务商有几家?
大家都知道抖音服务商多如牛毛,有本地生活服务商,MCN机构服务商,企业认证服务商,ISV服务商等等。但是aan服务商就屈指可数。 aan技术服务商 从关系层面讲,aan服务商的关系友好到啥程度呢,就好比微信指定了…...

10-26 maven配置
打开idea 打开setting 基于Idea创建idea项目 加载jar包:(一般需要自己去手动加入,本地仓库是没有的)...
贰[2],OpenCV函数解析
1,imread:图片读取 CV_EXPORTS_W Mat imread( const String& filename, int flags IMREAD_COLOR );//参数1(filename):文件地址 //参数2(flags):读取标志 注:ImreadModes,参数2(flags)枚举定义 enum ImreadModes { IMREAD…...

探秘Python闭包与作用域
文章目录 闭包的定义与作用LEGB规则nonlocal与global关键字在Python的世界里,理解闭包(Closure)和作用域(Scope)是提升编程技巧和深度的一大步。这篇文章将带你深入了解闭包的神秘面纱,掌握LEGB规则,并使用nonlocal与global关键字来巧妙控制变量作用域。 闭包的定义与作…...

GPT-4V:AI在教育领域的应用
OpenAI于9月25日发布了最新的GPT-4V模型,为ChatGPT引入了语音和图像功能,为用户提供更多元化的使用方式。这次更新将为用户带来更便捷、直观的交互体验,用户可以直接拍照上传并针对照片内容提出问题。OpenAI的最终目标是构建安全、有益的人工…...
自动化之Java面试
1.重写与重载的区别 重载规则: 方法名相同,参数个数或类型不同,与返回值类型无关,节约词汇,例如driver.switchTo().frame(index/nameOrId/frameElement) java的重载(overload) 最重要的应用场景就是构造器…...

Redis中的Zset类型
目录 Zset的相关命令 zadd zrange zcard zcount zrevrange zrangebyscore zpopmax bzpopmax zpopmin和bzpopmin zrank zrevrank zscore zrem zremrangebyrank zremrangebyscore 操作集合间的命令 zinterstore和zunionstore 内部编码 Zset的应用场景 Zset表…...
Python行对齐工具difflib
1 用途 1.1 功能 对比两个字符串数组之间的差异,以第一个参数为基准,与第二个参数比较。 1.2 使用场景 一个原文件,一个改过的文件,对比差异;一个纯文本,一个带格式的,对比差异;…...

Flutter利用GridView创建网格布局实现优美布局
文章目录 简介使用详解导入依赖项创建一个基本的 GridView一些参数说明使用GridView.count来构造 其他控制总结 简介 GridView 是 Flutter 中用于创建网格布局的强大小部件。它允许你在行和列中排列子小部件,非常适合显示大量项目,例如图像、文本、卡片…...
IDEA 基本配置
IDEA 基本配置 1、基本样式2、环境参数3、基本插件4、参考 1、基本样式 设置全局字体大小 配置font 字体大小:15 配置类注释 /** ** Author: ${USER}* Date: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE}* Version: 1.0.0 */配置注释keymap 添加 注释 ccm&…...
计算机组成原理平时作业一
计算机组成原理平时作业一 1.单选题 1.1计算机中使用总线结构便于增减外设,同时(c )。 a.减少了信息传输量 b.提高了信息传输量 c.减少了信息传输量的条数 d.三者均正确 答案解析: 概念规定 1.2在定点补码运算器中,…...

iOS Crash 治理:淘宝VisionKitCore 问题修复
本文通过逆向系统,阅读汇编指令,逐步找到源码,定位到了 iOS 16.0.<iOS 16.2 WKWebView 的系统bug 。同时苹果已经在新版本修复了 Bug,对于巨大的存量用户,仍旧会造成日均 Crash pv 1200 uv 1000, 最终通…...
NSSM部署window服务
nssm 下载 安装服务:nssm install <servicename> 启动服务:nssm start <servicename> 停止服务:nssm stop <servicename> 重启服务: nssm restart <servicename> 删除创建的servername服务: nssm remove <service…...
Go语言数据类型
文章目录 Go语言数据类型一、布尔类型二、数字类型三、字符串类型四、派生类型 Go语言数据类型 在 Go 编程语言中,数据类型用于声明函数和变量。 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存…...

Python爬取汽车之家二手车数据并作可视化
大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 课程亮点: 1、系统分析目标网页 2、html标签数据解析方法 3、海量数据一键保存 获取二手车数据 环境介绍: python 3.8 pycharm 2022.3专业版 requests >>>…...

NeRF神经辐射场渲染过程详解,三维重建渲染过程基本原理_光线采样sample_pdf()和光线渲染render_rays ()代码详解
目录 1 神经辐射场 1.1 基本原理 1.2 基本流程 1.3 数学解释 2 三维场景图像渲染详解 2.1射线采样 2.2 NeRF 模型预测 2.3 体积渲染 3 采样与渲染代码详解 (rending.py) 3.1 神经体积渲染代码解析 3.2 sample_pdf 函数 3.3 render_rays 函数 …...

Msa类处理多序列比对数据
同源搜索,多序列比对等都是常用的方式,但是有很多的软件可以实现这些同源搜索和多序列比对,但是不同的软件输出的文件格式却是不完全一致,有熟悉的FASTA格式的,也有A2M, A3M,stockholm等格式。 详细介绍: …...

Spark-TTS: AI语音合成的“变声大师“
嘿,各位AI爱好者!还记得那些机器人般毫无感情的合成语音吗?或者那些只能完全模仿但无法创造的语音克隆?今天我要介绍的Spark-TTS模型,可能会让这些问题成为历史。想象一下,你可以让AI不仅说出任何文字&…...
【Python 进阶3】常见的 call 和 forward 区别
在 Python 和深度学习框架(如 PyTorch)中,__call__ 和 forward 是两个不同的概念,它们的用途和实现方式有明显区别: 1. __call__ 方法(Python 内置特殊方法) 在 Python 中,__call_…...

第1天:认识RNN及RNN初步实验(预测下一个数字)
RNN(循环神经网络) 是一种专门设计用来处理序列数据的人工神经网络。它的核心思想是能够“记住”之前处理过的信息,并将其用于当前的计算,这使得它非常适合处理具有时间顺序或上下文依赖关系的数据。 核心概念:循环连…...

头歌之动手学人工智能-Pytorch 之autograd
目录 第1关:Variable 任务描述 编程要求 测试说明 没有伟大的愿望,就没有伟大的天才。——巴尔扎克开始你的任务吧,祝你成功! 第2关:Variable 属性 任务描述 编程要求 测试说明 真正的科学家应当是个幻想家&a…...

【C语言入门级教学】冒泡排序和指针数组
文章目录 1.冒泡排序2.⼆级指针3.指针数组4.指针数组模拟⼆维数组 1.冒泡排序 冒泡排序的核⼼思想:两两相邻的元素进⾏⽐较。 //⽅法1 void bubble_sort(int arr[], int sz)//参数接收数组元素个数 { int i 0;for(i0; i-1; i) { int j 0; for(j0; j-1; j) { …...
解决:输入SSH后,仍无法通过网址登录以及紧接着的新问题Permission denied(publickey,password).
现象: 管理员: Windows PowerShell输入SSH后,仍无法通过网址登录 例如输入你的ssh命令:ssh -CNg -L xxxx:127.0.0.1:xxxx rootaaaaaaaaa.com -p yyyyy 得到终端提示:ssh无法识别为 cmdlet、函数、脚本文件或可运行程序的名称。 解…...

【汽车电子入门】一文了解LIN总线
前言:LIN(Local Interconnect Network)总线,也就是局域互联网的意思,它的出现晚于CAN总线,于20世纪90年代末被摩托罗拉、宝马、奥迪、戴姆勒、大众以及沃尔沃等多家公司联合开发,其目的是提供一…...

PH热榜 | 2025-06-02
1. Circuit Tracer 标语:Anthropic的开放工具:让我们了解AI是如何思考的 介绍:Anthropic的开源工具Circuit Tracer可以帮助研究人员理解大型语言模型(LLMs),它通过将内部计算可视化为归因图的方式展现相关…...

Mysql库的操作和表的操作
Mysql库和表的操作 库的操作1.查看数据库列表2.创建数据库3.使用数据库4.查看当前在那个数据库中5.显示数据库的创建语句6.修改数据库7.删除数据库8.备份和恢复数据库9.查看数据的连接情况(简单来说就是查看有多少人使用你的数据库) 表的操作1.创建表2.查看表结构3.修改表本身(…...

性能优化 - 案例篇:数据一致性
文章目录 Pre引言1. 分布式缓存概念2. Redis 与 Memcached 区别概览3. Spring Boot 中使用 Redis3.1 引入依赖与常用客户端3.2 RedisTemplate 的基本用法3.3 Spring Cache 注解式缓存 4. 秒杀业务简介及挑战5. Lua 脚本实现原子库存扣减5.1 准备阶段:数据预加载5.2 …...