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 的最⼤优势。

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

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

相关文章

智能文件改名:高效复制并删除冗余,简化文件管理“

在繁杂的电脑文件世界中,如何高效地管理文件成为了许多人的难题。为了解决这一难题,我们推出了一款智能文件改名工具,它能够轻松复制文件并删除目标文件夹中的冗余文件,让您的文件管理更加高效便捷。 第一步,我们要打…

【网络协议】聊聊HTTPDNS如何工作的

传统 DNS 存在哪些问题? 域名缓存问题 我们知道CND会进行域名解析,但是由于本地会进行缓存对应的域名-ip地址,所以可能出现过期数据的情况。 域名转发问题 出口 NAT 问题 域名更新问题 解析延迟问题 因为在解析DNS的时候,需要进行…

Flink--Data Source 介绍

Data Source 简介 Flink 做为一款流式计算框架,它可用来做批处理,即处理静态的数据集、历史的数据集;也可以用来做流处理,即实时的处理些实时数据流,实时的产生数据流结果,只要数据源源不断的过来&#xff…

Spring的缓存机制-循环依赖

群公告 Java每日大厂面试题: 1、Spring 是如何解决循环依赖? 答案:三级缓存,简单来说,A创建过程中需要B,于是A将自己放到三级缓存里面,去实例化B,B实例化的时候发现需要…

【AICFD案例教程】进气歧管分析

AICFD是由天洑软件自主研发的通用智能热流体仿真软件,用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程,帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

CSS时间线样式

css实现时间线样式,效果如下图: 一、CSS代码 .timeline {padding-left: 5px} .timeline-item { position: relative;padding-bottom: 20px;} .timeline-axis {position: absolute;left: -5px;top: 0;z-index: 10;width: 20px;height: 20px;line-he…

Android Studio报错:connect refused

参考链接: https://blog.csdn.net/qq_43213783/article/details/113936012 参考文章中说报错主要是由于代理导致的,在文件->设置->外观与行为->系统设置->HTTP代理。 方法一: 查看打开代理(前提是代理可以通网&#x…

数据可视化PCA与t-SNE

PCA(主成分分析)和t-SNE(t分布随机近邻嵌入)都是降维技术,可以用于数据的可视化和特征提取。 降维:把数据或特征的维数降低,其基本作用包括: 提高样本密度,以及使基于欧…

实验(一):运算器实验

一、实验内容与目的 实验要求: 利用 CP226 实验仪的 K16..K23开关做为DBUS数据,其它开关做为控制信号,将数据写累加器A和工作寄存器W,并用开关控制ALU的运算方式,实现运算器的功能,将结果送入OUT寄存器。 实…

C# TCP Server服务端多线程监听RFID读卡器客户端上传的读卡数据

本示例使用设备介绍:液显WIFI无线网络HTTP协议RFID云读卡器可编程实时可控开关TTS语-淘宝网 (taobao.com) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using Sy…

EM@解三角形@正弦定理@余弦定理

文章目录 abstract解三角形基本原理不唯一性 正弦定理直角三角形中的情形推广锐角三角形钝角情形 小结:正弦定理 余弦定理直角三角形中的情形非直角情形小结:余弦定理公式的角余弦形式 abstract 解直角三角形问题正弦定理和余弦定理的推导 对于非直角情形,都是直角情形的推广同…

机器视觉的试卷批改系统 - opencv python 视觉识别 计算机竞赛

文章目录 0 简介1 项目背景2 项目目的3 系统设计3.1 目标对象3.2 系统架构3.3 软件设计方案 4 图像预处理4.1 灰度二值化4.2 形态学处理4.3 算式提取4.4 倾斜校正4.5 字符分割 5 字符识别5.1 支持向量机原理5.2 基于SVM的字符识别5.3 SVM算法实现 6 算法测试7 系统实现8 最后 0…

微服务架构深入理解 | 技术栈

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 微服务架构深入理解 | 技术栈 服务网关 服务网关是在微服务架构中扮演重要角色的组件,它是系统对外的入口,负责接收和处理客户端的请求&#x…

【算法 | 模拟No.3】leetcode 38. 外观数列

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【Leetcode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

鸿蒙原生应用开发-DevEco Studio超级终端模拟器的使用

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

中远麒麟堡垒机SQL注入漏洞复现

简介 中远麒麟堡垒机用于运维管理的认证、授权、审计等监控管理,在该产品admin.php处存在SQL 注入漏洞。 漏洞复现 FOFA语法: body"url\"admin.php?controlleradmin_index&actionget_user_login_fristauth&username" 或者 c…

redis: 记录一次线上redis内存占用过大问题解决过程

引言 记录一次线上redis占用过大的排查过程,供后续参考 问题背景 测试同事突然反馈测试环境的web系统无法登陆,同时发现其他子系统也存在各类使用问题 排查过程 1、因为首先反馈的是测试环境系统无法登陆,于是首先去查看了登陆功能的报错…

【STM32】HAL库UART含校验位的串口通信配置BUG避坑

【STM32】HAL库UART含校验位的串口通信配置BUG避坑 文章目录 UART协议校验位HAL库配置含校验位的串口配置BUG避坑附录:Cortex-M架构的SysTick系统定时器精准延时和MCU位带操作SysTick系统定时器精准延时延时函数阻塞延时非阻塞延时 位带操作位带代码位带宏定义总线函…

Vuex状态管理(简单易懂、全网最全)

目录 Vuex是什么? 如何部署 如何使用 state 基础使用 在计算属性属性中使用 使用展开运算符 mutations 基础使用 使用辅助函数(mapMutations)简化 使用常量替代 Mutation 事件类型 getters actions 使用辅助函数(…

启动Hbase出现报错

报错信息:slave1:head: cannot open/usr/local/hbase-2.3.1/bin/../logs/hbasewanggiqi-regionserver-slavel.out’ for reading: No such file or direslave2: head: cannot open/usr/local/hbase-2.3.1/bin/../logs/hbasewangqiqi-regionserver-slave2.out’ for …