搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
小小林熬夜学编程
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
使用TwoSampleMR进行两样本的孟德尔随机化研究
2
Unity--PropertyAttribute和PropertyDrawer结合使用将string转为资源引用_unity inspector中路径显示为资源引用
3
2024 安装pytorch_安装pytorch1.0
4
【uniapp小程序】—— APP项目云打包(安卓)_uniapp打包安卓
5
【区块链之技术进阶】扒一扒某乎上面对于区块链的理解(二)
6
全球各国大数据市场的发展现状
7
STM32手写寄存器的方式实现点亮LED灯
8
无人机三维实景模型的应用和发展_基于无人机航测的三维实景建模心得体会
9
Spring MVC 快速入门之 入门基础_requestmapping作用于
10
nodejs消息推送之ws_node推送ws
当前位置:
article
> 正文
Java高并发面试题大全含答案_高并发面试题java
作者:小小林熬夜学编程 | 2024-05-15 19:25:20
赞
踩
高并发面试题java
1 Thread的start方法和run方法的区别?
run方法就是普通的一个方法,代码运行在当前主线程,start会启动一个新的线程,并运行run方法。
2 如何停止线程运行?
可以设置一个标志位,任务定期检查这个标记,如果标志设置为取消则任务停止执行,但已执行部分无法停止,标志变量最好设置为volatile。
3 普通线程与守护线程?
本质都是线程没什么区别,守护线程在主线程结束时将被抛弃,自动退出。比如垃圾回收线程。
4 数据库死锁?
在执行一个事务时可能要获取多个锁,一直持有锁到事务提交,如果A事务需要获取的锁在另一个事务B中,且B事务也在等待A事务所持有的锁,那么两个事务之间就会发生死锁。但数据库死锁比较少见,数据库会加以干涉死锁问题,牺牲一个事务使得其他事务正常执行。
5 什么是锁顺序死锁?
两个线程试图以不同的顺序获得相同的锁,那么可能发发生死锁。比如转账问题,由from账户向to账户转账,假设每次我们先同步from对象,再同步to账户,然后执行转账操作,貌似没什么问题。如果这时候to账户同时向from账户转账,那么两个线程可能要永久等待了。
6 死锁的避免与诊断?
如果一个线程最多只能获取一个锁,那么就不会发生锁顺序死锁了。如果确实需要获取多个锁,锁的顺序可以按照某种规约,比如两个资源的id值,程序按规约保证获取锁的顺序一致。或者可以使用显式的锁Lock,获取锁的时候设置超时时间,超时后可以重新发起,以避免发生死锁。
7 线程饥饿与活锁?
当线程由于无法访问需要的资源而不能继续执行时,就是饥饿状态。活锁是线程虽然没有阻塞,但也不能继续执行,因为程序总是执行相同的操作,且结果都是失败。
8 多线程性能问题?
使用多线程主要就是为了提高程序的运行性能,多线程可以更充分发挥系统可处理能力,从而提高系统资源利用率。但多线程自身同时带来了性能开销,线程的创建与销毁,线程间的协调(比如加锁、内存同步),线程调度,上下文的切换等。好的并发设计就是充分利用现有资源,尽可能使处理器忙碌起来,当然程序设计始终不能脱离业务场景。
9 内存同步?
在synchronized和volatile提供的可见性保证中可能会用到内存屏障,内存屏障可以刷新缓存,使缓存无效。同时内存屏障会抑制一些编译器优化操作,大多数操作不能被重排序。
10 jvm同步优化?
jvm可以通过优化去掉一些不必要的锁,从而减少同步开销。比如一个对象只能被当前线程访问,其他线程不会与当前线程在这个锁上发生同步,jvm可以锁优化去掉同步操作。编译器也可以进行锁粒度粗化操作,将临近的多个同步代码用一个锁合并起来,不仅可以减少多个同步带来的不必要的开销,同时还能使优化器处理更大的代码块,带来进一步的优化。锁自旋,当线程发生阻塞时,可能会自旋等待(不断循环尝试去获取锁),或者通过操作系统挂起线程,当然这要看锁等待时间,来决定是否自旋。
11 降低锁的竞争?
减少锁的持有时间,减少锁的请求频率,使用带有协调机制的独占锁。具体实现可以缩小锁的范围,快进快出。比如只锁同步操作代码块,不要把相关非同步业务逻辑也包含到同步代码块中。可以减小锁的粒度,能对目标对象进行上锁,就不要对操作目标对象的方法上锁,也可以使用一些锁分段技术的组件,比如ConcurrentHashMap。也可以使用一些非独占锁,比如ReadWriteLock。
12 java中常见的同步机制?
java主要同步机制是synchronized关键字, 还有显式的Lock,volatile,atomic,还有一些同步集合、阻塞队列等。
13 共享变量在多线程下如何保证线程安全?
因为多线程是交替执行,每个线程操作共享变量时可能会导致数据不一致,要确保线程安全,需要在访问共享变量时添加同步机制。当然,如果这个变量本身是线程安全的,比如AtomicLong,那么多线程访问也是安全的。
14 是否共享变量都使用类似AtomicLong原子安全类,多线程访问就是安全的?
这个不确定,因为无法保证多个变量同时操作,一个原子变量可以保证自己的安全性,但是同时操作多个有逻辑依赖原子的变量,仍可能带来线程安全问题。单个安全不代表组合也安全。
15 synchronized锁的使用?
synchronized同步代码块,修饰的方法是整个方法体,同步代码块的锁就是方法调用所在的对象实例;静态的synchronized方法以Class对象作为锁;还可以修饰具体对象,以具体对象为锁。
16 可重入锁,synchronized是可重入的吗?
当一个线程拥有对象锁之后,如果再次访问此对象的同步代码块或对象时,不再需要获取锁,这就是可重入锁;synchronized是可重入的。
18 volatile关键字的理解?
volatile属于一个轻量的同步原语,被它修饰的变量,变量的更新操作可以通知到其他线程。简单来说,就是volatile修饰的变量不会被执行重排序,所以保证了变量的可见性。但volatile无法保证变量的原子性操作,仍然是不安全的,通常可以用作标志位,如退出线程的循环变量。
19 final修饰的不可变对象?
由关键字final修饰的对象是不可变的,不能被重新赋值,但是final仍可以修饰可变对象的引用,例如集合:final修饰的集合本身引用地址不能改变,但是集合内的数据还是可以修改的。不可变对象会减少加锁或保护性副本的需求,可以带来一些性能上的优势。
20 常见的并发容器?
ConcurrentHashMap:使用了分段锁,锁的粒度变得更小,多线程访问时,可能都不存在锁的竞争,所以大大提高了吞吐量。简单对比来看,就好比数据库上用行锁来取代表锁,行锁无疑带来更大的并发。
CopyOnWriteArrayList:写入时复制,多线程访问时,彼此不会互相干扰或被修改的线程所干扰,当然copy时有开销的,尤其时列表元素庞大,且写入操作频繁时,所以仅当迭代操作远远大于修改操作时,才应该考虑使用。
BlockingQueue:阻塞队列提供了可阻塞的put和take方法,当队列已经满了,那么put操作将阻塞到队列可用,当队列为空时,take操作会阻塞到队列里有数据。有界的队列是一种强大的资源管理器,可以在程序负荷过载时保护应用,可作为一种服务降级的策略。阻塞队列还提供offer操作,当数据无法加入队列时,返回失败状态,给应用主动处理负荷过载带来更多灵活性。
21 常见的同步工具类?
CountDownLatch:递减计数器闭锁,直到达到某个条件时才放行,多线程可以调用await方法一直阻塞,直到计数器递减为零。比如我们连接zookeeper,由于连接操作是异步的,所以可以使用countDownLatch创建一个计数器为1的锁,连接挂起,当异步连接成功时,调用countDown通知挂起线程;再比如5V5游戏竞技,只有房间人满了才可以开始游戏。
FutureTask:带有计算结果的任务,在计算完成时才能获取结果,如果计算尚未完成,则阻塞 get
方法。FutureTask将计算结果从执行线程传递到获取这个结果的线程。
Semaphore:信号量,用来控制同时访问某个特定资源的数量,只有获取到许可acquire,才能够正常执行,并在完成后释放许可,acquire会一致阻塞到有许可或中断超时。使用信号量可以轻松实现一个阻塞队列。
CyclicBarrier:类似于闭锁,它可以阻塞一组线程,只有所有线程全部到达以后,才能够继续执行,so线程必须相互等待。这在并行计算中是很有用的,将一个问题拆分为多个独立的子问题,当线程到达栅栏时,调用await等待,一直阻塞到所有参与线程全部到达,再执行下一步任务。
22 线程’饥饿’死锁
在线程池中,如果一个任务依赖其他任务,那么可能会导致线程死锁。比如在单线程的Executor中,一个任务将另一个任务提交到Executor中,等待这个任务的处理结果。第一个任务在等待第二个任务,而第二个任务在队列里等待第一个任务执行完成。
23 ThreadPoolexecutor参数配置?
corePoolSize- 池中所保存的线程数,包括空闲线程。 maximumPoolSize - 池中允许的最大线程数。 keepAliveTime-
当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。 unit - keepAliveTime 参数的时间单位。
workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。
threadFactory- 执行程序创建新线程时使用的工厂。 handler -
由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。
如果池中运行的线程小于coreSize,那么新的请求将创建新的线程,如果coreSize线程全部忙碌,新请求将被添加到队列,如果队列已满,那么将继续创建新线程,但线程总数<=maximumPoolSize,多余coreSize的线程会在超过keepAliveTime终止。
24 线程池任务饱和时处理策略?
当线程池线程数已经达到最大值,注意这时队列一定已经满了,线程池已经处于饱和状态,那么新来的请求将会按照相对应的策略被处理。
AbortPolicy:拒绝任务,抛出RejectedExecutionException CallerRunsPolicy:在
execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务。 DiscardPolicy:直接丢弃。
25 什么是Executor?
Executor执行已提交的Runnable任务,把任务和执行机制分离开来,可以看作是一个任务执行框架,任务与执行的解耦,可以更灵活的指定执行方式。所以应该使用Executor代替new
Thread(Runnable).start()。
26 什么是线程池,如何创建线程池?
线程池就是由一组活跃的线程集合,由于线程的创建与销毁开销都比较大,所以利用线程池减少线程的性能开销,提高响应性。适当的调节线程池大小,可以有效利用处理器,同时防止过多线程相互竞争资源耗费内存。使用Executors可以很方便的创建线程池。
27 Executors可以创建哪些类型的线程池?
newFixedThreadPool:创建一个固定大小的线程池,每当提交一个任务就创建一个线程,直到达到最大数量,达到最大线程数后线程规模不再变化。
newCachedThreadPool:创建一个可以根据需要创建新线程的线程池,当线程规模大于处理请求时,将回收空闲线程,当需求增加时,可以添加新的线程。
newSingleThreadExecutor:创建一个单线程Executor。
newScheduledThreadPool:创建一个固定长度,以延迟或定时的执行方式执行任务。
28 Executor的生命周期?
ExcutorService扩展了Executor,有三种状态:运行,关闭,已终止。可以调用shutdown方法,优雅关闭任务,这时将不再接受新的任务,同时等待已提交的任务执行完成。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/574631
推荐阅读
article
java
+jsp+
Oracle
+Tomcat
记账
管理系统
论文(二)_大学生
记账
管理系统
总体
er
图...
本章内容包括系统类分析、核心业务设计、数据库设计三个部分,其中系统类分析需要给出系统类图和类的说明,需要注意在给出类图的...
赞
踩
article
java
方法
参数
的
注解
_聊聊
springmvc
中controller
的
方法
的
参数
注解
方式...
绪论相信接触过
springmvc
的
同学都知道,在
springmvc
的
控制层中,我们在
方法
的
参数
中可以使用
注解
标识。比如下...
赞
踩
article
Java
注解
详情与
自定义
注解
实战
_
自定义
注解
实战
...
Java
注解
(Annotation)用于为
Java
代码提供元数据。作为元数据,
注解
不直接影响你的代码执行,但也有一些类型...
赞
踩
article
java
注解
_
通俗易懂
的讲解下
Java
注解
...
对于
Java
注解
,我咨询过一些身边的人,很多人表示:知道怎么用,不熟悉不知道你是不是这样?在我没有系统性的学习一边
注解
的...
赞
踩
article
华为
OD
机试题库大全【
JAVA
&
Python
&
C++
&JS题解】_生成哈夫曼树
c++
od...
OD
机试是一项重要环节,用于评估应聘者的编程能力和算法理解程度。在申请
OD
岗位时,应聘者需要首先通过机试的考核,才有机会...
赞
踩
article
Java
框架
安全
:
Spring
漏洞
序列.
(
CVE-2022-22965)...
Spring
框架
是一个用于构建企业级应用程序的开源
框架
。它提供了一种全面的编程和配置模型,可以简化应用程序的开发过程。...
赞
踩
article
【
华为
机试
】2024年
真题
C卷(
java
)-最
长子
字符
串
的长度1_给你
一个
字符
串
s
,
字符
串
s
首尾相...
【
华为
机试
】2024年
真题
C卷(
java
)-最
长子
字符
串
的长度1_给你
一个
字符
串
s
,
字符
串
s
首尾相连
成
一个
环形
,
请你...
赞
踩
article
【华为OD机试真题
2023C
&D卷
JAVA
&JS】最长子
字符
串
的长度(
一
)_给
你
一
个
字符
串
s
,
字...
最长子
字符
串
的长度(
一
) 给
你
一
个
字符
串
s
,
字符
串
s
首尾相连
成
一
个
环形
,请
你
在环中找出
'
o
'
字符
出现了偶数次最长子字...
赞
踩
article
2023
华为
OD
面试
手撕代码真题【
LRU
实现】_
华为
od
java
手撕代码提...
华为
OD
面试
手撕代码真题【
LRU
实现】_
华为
od
java
手撕代码提
华为
od
java
手撕代码提 ...
赞
踩
article
Java
面试——
Zookeeper
_
zookeeper
设计模式
...
Java
面试——
Zookeeper
一、
Zookeeper
实现机制文件系统 + 通知机制**二、**
Zookeeper
...
赞
踩
article
Java项目:餐厅
点餐
系统(
java
+
SpringBoot
+HTML+
layui
+Echarts+m...
项目介绍Springboot餐厅
点餐
系统分为前后台,前台顾客可以进行
点餐
,后台可以由经理、收银员、厨师、服务员等角色登录...
赞
踩
article
基于
java
web+
mysql
的
springboot
+
mybatis
网上订餐在线
点餐
管理系统
(前台、...
基于
java
web+
mysql
的
springboot
+
mybatis
网上订餐在线
点餐
管理系统
(前台、后台)(
java
+s...
赞
踩
article
Java
【
数据结构
】
TreeSet
&
TreeMap
(
二叉
搜索
树
详解)【神装】...
每个节点都有一个键(Key)和两个指向其他节点的指针(左子指针和右子指针)。任意节点的左子
树
中的所有键都小于该节点的键。...
赞
踩
article
数据结构
之
顺序
表
ArrayList
(
Java
)_
java
中
arraylist
的
数据结构
...
在该篇文章中,大概介绍了
顺序
表,以及模拟实现了
顺序
表中的常用方法;_
java
中
arraylist
的
数据结构
java
中ar...
赞
踩
article
已
解决
java
.
lang
.
ArrayStoreException
:
数组存储异常的正确
解决
方法,亲测...
已
解决
java
.
lang
.
ArrayStoreException
:
数组存储异常的正确
解决
方法,亲测有效!!!_caus...
赞
踩
article
Caused by:
java
.
lang
.
ArrayStoreException
:
sun
.refl...
启动项目报错之jar包冲突(Caused by:
java
.
lang
.
ArrayStoreException
:
sun
....
赞
踩
article
java
.
lang
.
ArrayStoreException
: sun.
reflect
.annotat...
1、
java
.
lang
.
ArrayStoreException
这个的debug借助IDEA,添加Java Excepti...
赞
踩
article
深入
Spring
Boot :怎样排查
java
.
lang
.
ArrayStoreException
...
深入
Spring
Boot :怎样排查
java
.
lang
.
ArrayStoreException
hengyunabc...
赞
踩
article
有关
java
.
lang
.
ArrayStoreException
运行
异常
的解决方法_
java
.
lang
...
若正常写着代码,idea会自动导入一个import org.omg.CORBA.Object;的包,导致代码出现
java
...
赞
踩
article
java
.
lang
.ArrayStoreException...
java
.
lang
.ArrayStoreException今天想把 List
类型的集合转为 Stri...
赞
踩
相关标签
java
oracle
tomcat
jsp
课程设计
毕业设计
java 方法参数的注解
spring
开发语言
经验分享
运维
java 注解
python
华为od
javascript
c++
c语言
安全
web安全
网络安全
算法
机试真题
最长子字符串的长度