当前位置: 首页 > news >正文

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 、同步容器
  1. 主要代表有VectorHashtable,以及Collections.synchronizedXxx等。
  2. 锁的粒度为当前对象整体。
  3. 迭代器是及时失败的,即在迭代的过程中发现被修改,就会抛出ConcurrentModificationException
2 、并发容器
  1. 主要代表有ConcurrentHashMapCopyOnWriteArrayListConcurrentSkipListMapConcurrentSkipListSet
  2. 锁的粒度是分散的、细粒度的,即读和写是使⽤不同的锁。
  3. 迭代器具有弱⼀致性,即可以容忍并发修改,不会抛出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 优点
  1. 减少了创建和销毁线程的次数,每个⼯作线程都可以被重复利⽤,可执⾏多个任务
  2. 可以根据系统的承受能⼒,调整线程池中⼯作线线程的数⽬,防⽌因为因为消耗过多的内存,⽽把服务器累趴下(每个线程需要⼤约1MB内存,线程开的越多,消耗的内存也就越⼤,最后死机)
  • 减少在创建和销毁线程上所花的时间以及系统资源的开销
  • 如不使⽤线程池,有可能造成系统创建⼤量线程⽽导致消耗完系统内存
2 、⽐较重要的⼏个类:

描述
ExecutorService真正的线程池接口
ScheduledExecutorService能和Timer/TimerTask类似,解决那些需要任务重复执行的问题
ThreadPoolExecutorExecutorService的默认实现
ScheduledThreadPoolExecutor

继承ThreadPoolExecutor的ScheduldExecutorService接口实现,周期性任务调度的类实现

3、任务执行顺序

 

i. 当线程数⼩于 corePoolSize 时,创建线程执⾏任务。
ii. 当线程数⼤于等于 corePoolSize 并且 workQueue 没有满时,放⼊ workQueue
iii. 线程数⼤于等于 corePoolSize 并且当 workQueue 满时,新任务新建线程运⾏,线程总数要⼩于 maximumPoolSize
iv. 当线程总数等于 maximumPoolSize 并且 workQueue 满了的时候执⾏ handler rejectedExecution 。也就是拒绝策略。

6、Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。

1 ArrayBlockingQueue 数组结构组成的有界阻塞队列:
2、CountDownLatch 允许⼀个或多个线程等待其他线程完成操作;

7、synchronized和ReentrantLock的区别?

1 、基础知识
  • 可重⼊锁。可重⼊锁是指同⼀个线程可以多次获取同⼀把锁。ReentrantLocksynchronized都是可重⼊锁。
  • 可中断锁。可中断锁是指线程尝试获取锁的过程中,是否可以响应中断。synchronized是不可中断锁,⽽ReentrantLock则提供了中断功能。
  • 公平锁与⾮公平锁。公平锁是指多个线程同时尝试获取同⼀把锁时,获取锁的顺序按照线程达到的顺序,⽽⾮公平锁则允许线程“插队”。synchronized是⾮公平锁,⽽ReentrantLock的默认实现是⾮公平锁,但是也可以设置为公平锁。
  • CAS操作(CompareAndSwap)。CAS操作简单的说就是⽐较并交换。CAS 操作包含三个操作数 —— 内存位置V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会⾃动将该位置值更新为新值。否则,处理器不做任何操作。⽆论哪种情况,它都会在 CAS 指令之前返回该位置的值。CAS 有效地说明了“我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。”
2 Synchronized
i. synchronized java 内置的关键字,它提供了⼀种独占的加锁⽅式。 synchronized 的获取和释放锁由 JVM 实现,⽤户不需要显示的释放锁,⾮常⽅便。然⽽synchronized 也有⼀定的局限性:
  • 当线程尝试获取锁的时候,如果获取不到锁会⼀直阻塞。
  • 如果获取锁的线程进⼊休眠或者阻塞,除⾮当前线程异常,否则其他线程尝试获取锁必须⼀直等待。
3 ReentrantLock
i. 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、Hashtablesize()⽅法中明明只有⼀条语句”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 问题修复

本文通过逆向系统&#xff0c;阅读汇编指令&#xff0c;逐步找到源码&#xff0c;定位到了 iOS 16.0.<iOS 16.2 WKWebView 的系统bug 。同时苹果已经在新版本修复了 Bug&#xff0c;对于巨大的存量用户&#xff0c;仍旧会造成日均 Crash pv 1200 uv 1000&#xff0c; 最终通…...

NSSM部署window服务

nssm 下载 安装服务&#xff1a;nssm install <servicename> 启动服务&#xff1a;nssm start <servicename> 停止服务&#xff1a;nssm stop <servicename> 重启服务: nssm restart <servicename> 删除创建的servername服务: nssm remove <service…...

Go语言数据类型

文章目录 Go语言数据类型一、布尔类型二、数字类型三、字符串类型四、派生类型 Go语言数据类型 在 Go 编程语言中&#xff0c;数据类型用于声明函数和变量。 数据类型的出现是为了把数据分成所需内存大小不同的数据&#xff0c;编程的时候需要用大数据的时候才需要申请大内存…...

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 采样与渲染代码详解 &#xff08;rending.py&#xff09; 3.1 神经体积渲染代码解析 3.2 sample_pdf 函数 3.3 render_rays 函数 …...

Msa类处理多序列比对数据

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

Spark-TTS: AI语音合成的“变声大师“

嘿&#xff0c;各位AI爱好者&#xff01;还记得那些机器人般毫无感情的合成语音吗&#xff1f;或者那些只能完全模仿但无法创造的语音克隆&#xff1f;今天我要介绍的Spark-TTS模型&#xff0c;可能会让这些问题成为历史。想象一下&#xff0c;你可以让AI不仅说出任何文字&…...

【Python 进阶3】常见的 call 和 forward 区别

在 Python 和深度学习框架&#xff08;如 PyTorch&#xff09;中&#xff0c;__call__ 和 forward 是两个不同的概念&#xff0c;它们的用途和实现方式有明显区别&#xff1a; 1. __call__ 方法&#xff08;Python 内置特殊方法&#xff09; 在 Python 中&#xff0c;__call_…...

第1天:认识RNN及RNN初步实验(预测下一个数字)

RNN&#xff08;循环神经网络&#xff09; 是一种专门设计用来处理序列数据的人工神经网络。它的核心思想是能够“记住”之前处理过的信息&#xff0c;并将其用于当前的计算&#xff0c;这使得它非常适合处理具有时间顺序或上下文依赖关系的数据。 核心概念&#xff1a;循环连…...

头歌之动手学人工智能-Pytorch 之autograd

目录 第1关&#xff1a;Variable 任务描述 编程要求 测试说明 没有伟大的愿望&#xff0c;就没有伟大的天才。——巴尔扎克开始你的任务吧&#xff0c;祝你成功&#xff01; 第2关&#xff1a;Variable 属性 任务描述 编程要求 测试说明 真正的科学家应当是个幻想家&a…...

【C语言入门级教学】冒泡排序和指针数组

文章目录 1.冒泡排序2.⼆级指针3.指针数组4.指针数组模拟⼆维数组 1.冒泡排序 冒泡排序的核⼼思想&#xff1a;两两相邻的元素进⾏⽐较。 //⽅法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).

现象&#xff1a; 管理员: Windows PowerShell输入SSH后&#xff0c;仍无法通过网址登录 例如输入你的ssh命令&#xff1a;ssh -CNg -L xxxx:127.0.0.1:xxxx rootaaaaaaaaa.com -p yyyyy 得到终端提示&#xff1a;ssh无法识别为 cmdlet、函数、脚本文件或可运行程序的名称。 解…...

【汽车电子入门】一文了解LIN总线

前言&#xff1a;LIN&#xff08;Local Interconnect Network&#xff09;总线&#xff0c;也就是局域互联网的意思&#xff0c;它的出现晚于CAN总线&#xff0c;于20世纪90年代末被摩托罗拉、宝马、奥迪、戴姆勒、大众以及沃尔沃等多家公司联合开发&#xff0c;其目的是提供一…...

PH热榜 | 2025-06-02

1. Circuit Tracer 标语&#xff1a;Anthropic的开放工具&#xff1a;让我们了解AI是如何思考的 介绍&#xff1a;Anthropic的开源工具Circuit Tracer可以帮助研究人员理解大型语言模型&#xff08;LLMs&#xff09;&#xff0c;它通过将内部计算可视化为归因图的方式展现相关…...

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 准备阶段&#xff1a;数据预加载5.2 …...