大厂面试都在问的高并发问题汇总【精选】,附代码案例

本文详细总结了Java高并发领域的核心面试问题,包括线程与进程的区别、死锁与活锁、线程组、Executor框架、阻塞队列、线程安全与同步机制、并发容器、原子操作、锁接口及其优势、并发工具类如ThreadLocal和CountDownLatch等,旨在帮助面试者理解和掌握Java并发编程的关键概念和技术。
摘要由CSDN通过智能技术生成

在 java 中守护线程和本地线程区别?

任何的线程都可以设置为守护线程或者用户线程,通过thread.setDaemon就可以设置。这个设置必须要在thread.satrt之前设置,否则就会报错。

可以简单的理解为守护线程是jvm创建的(但这不绝对),用户线程是应用程序创建的。比如jvm的垃圾回收线程就是守护线程,当所有线程已经撤离,不再产生垃圾,守护线程自然就没事可干了,当垃圾回收线程是 Java 虚拟机上仅剩的线程时,Java 虚拟机会自动离开。。Thread Dump 打印出来的线程信息,含有 daemon 字样的线程即为守护进程,可能会有:服务守护进程,编译守护进程,GC守护进程等等

线程与进程的区别?协程

进程是资源分配的最小单位,线程是操作系统调度的最小单位

一个进程至少有 一个进程,同一进程内的线程之间的资源共享

协程(用户态):

  • 因为函数(子程序)不是线程切换,而是由程序自身控制的,因此没有线程切换的开销;

  • 和多线程比,线程数量越多,协程的性能优势越明显

什么是多线程中的上下文切换?

多线程共同使用计算机上的一组CPU,当线程数量大于CPU数量的时候,为了让所有的线程都有机会执行,需要轮转切换cpu,当不同线程使用CPU时发生的数据切换就叫做上下文切换

死锁与活锁的区别,死锁与饥饿的区别?

死锁:多个线程因为互斥的抢占一个资源而互相等待,如果没有借助外力就不会 放弃

死锁产生的必要条件:

互斥:某一资源在同一时间内只能被一个线占有

循环等待:形成了一种首尾相连的环

请求并保持:不会放弃资源等待

不被剥夺条件:已经占有资源的线程,在未使用完前不能被剥夺

活锁:任务或者事件由于没有成功,会失败,重试,而不是不是一直等待下去,活锁可以自行解开资源 等待,就是破坏了死锁的一些必要条件

饥饿: 线程由于一直无法满足执行条件,导致一直无法执行,造成了饥饿。处于一直无法执行的状态、

java中导致饥饿的原因:

一直被高优先级的线程抢占资源,自身无法获取资源

线程等待一个自身处于等待完成的对象(比如调用这个对象的wait方法)

解决办法:选取比较合适的线程调度算法

什么是线程组,为什么在 Java 中不推荐使用?

线程组是ThreadGroup类,它在里面既可以有线程对象,也会有线程组对象,有点类似于树状结构 ,不用是因为有安全问题

为什么使用 Executor 框架?

传统的new thread方式创建销毁线程的开销很大,而且随着new thread 被无限制创建,会导致由于系统资源被耗尽而瘫痪的问题。这些线程缺乏管理,线程之前的交互也会销号较多的资源。Excutor Service较new thread有更好的服务支持,对开发者很友好,比如定时定期执行,中断

在 Java 中 Executor 和 Executors 的区别?

Executors 工具类可以根据我们的需求创建线程池满足业务需求

Executor 接口方法可以执行线程任务

ExcutorService继承了Excutor接口并且丰富了功能,通过这个服务我们可以管理线程,获取线程的执行状态或者返回值

例如 ThreadPoolExutor可以创建自定义线程池

Feture 表示异步计算结果方法,它可以清楚计算执行的状态和结果的返回,通过get方法获取计算的结果,通过then来完成后续需要这个结果的操作,是一个相当不错的在平时业务开发中会用到的特性。

什么是原子操作?在 Java Concurrency API 中有哪些原子类(atomic classes)?

原子操作是java中一个不被中断,不受其他线程操作影响的任务单元,CAS原语就是Compare&Swap

在atomic包下提供了很多一些原子操作类对int或者long都提供了原子操作类

还有针对一些结合也提供了原子操作 类。当线程调用这些原子对象的方法的时候,这些操作是排他的,不会被打断,当其他线程就会像自旋锁一样,等待这个对象执行完成,并且加入任务队列中,当前方法执行完成后,jvm会从队列中取出一个任务继续执行

缺陷:

ABA问题的原子操作类:AtomicMarkbleReference(通过加入一个boolean值来判断中间是否发生过变化)

AtomicStampedReference(通过加入一个int类型变量来判断中间是否发生过变化)

cpu的空转

Java Concurrency API 中的 Lock 接口(Lock interface)是什么?对比同步它有什么优势?

Lock接口较synchronized提供了更多丰富的功能,同步只支持非公平锁

而lock支持公平锁,轮询锁(try lock),无条件锁,定时锁,可中断锁

什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?

阻塞队列是一个支持两个附加操作的队列

支持当线程从队列里获取对象的时候,如果为空则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值