Java高并发面试题及答案(13道必考题图解)

Java高并发面试题及答案(13道必考题图解)-mikechen

Java高并发面试题是进程被问到的话题,下面给大家总结了常见的Java高并发面试题及答案@mikechen

什么是高并发?

高并发(High Concurrency)是一种系统运行过程中遇到的一种“短时间内遇到大量操作请求”的情况,主要发生在web系统集中大量访问收到大量请求(例如:12306的抢票情况;天猫双十一活动)。该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等。

 

高并发的处理指标?

高并发相关常用的一些指标有:

1.响应时间(Response Time)

响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间

2.吞吐量(Throughput)

吞吐量:单位时间内处理的请求数量。

3.每秒查询率QPS(Query Per Second)

QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。

4.并发用户数

并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。

 

高并发和多线程的关系和区别

“高并发和多线程”总是被一起提起,给人感觉两者好像相等,实则 高并发 ≠ 多线程

多线程并发技术

多线程是java的特性,因为现在cpu都是多核多线程的,可以同时执行几个任务,为了提高jvm的执行效率,java提供了这种多线程的机制,以增强数据处理效率。多线程对应的是cpu,高并发对应的是访问请求,可以用单线程处理所有访问请求,也可以用多线程同时处理访问请求。

在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。

再后来发展到多线程技术,使得在一个程序内部能拥有多个线程并行执行。一个线程的执行可以被认为是一个CPU在执行该程序。当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序。

 

进程、线程、多线程的区别?

进程

在操作系统中运行的程序就是进程,比如你的QQ、播放器、游戏、IDE等等

线程

Java高并发面试题及答案(13道必考题图解)-mikechen

一个进程可以有多个线程,如视频中同时听声音,看图像,看弹幕,等等。

多线程

多线程:多个线程并发执行。

 

什么是并发与并行?

并行

Java高并发面试题及答案(13道必考题图解)-mikechen
多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。

并发

Java高并发面试题及答案(13道必考题图解)-mikechen

通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。

 

并发编程有哪三要素?

1) 原子性原子

即一个不可再被分割的颗粒。在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。

 2)有序性

程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)

 3)可见性

当多个线程访问同一个变量时,如果其中一个线程对其作了修改,其他线程能立即获取到最新的值。

 

守护线程和非守护线程的区别?

用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开。

如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了, 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。

简而言之,普通线程在没执行完的时候不能退出,而守护线程是把普通线程守护起来运行,线程退出了守护也一起退出。排除特殊性和安全级别的话,普通线程和守护线程没有太大的区别。

 

线程的生命周期有哪些?

Java高并发面试题及答案(13道必考题图解)-mikechen

在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态

  • 新建状态:当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时仅由JVM为其分配内存,并初始化其成员变量的值
  • 就绪状态:当线程对象调用了start()方法之后,该线程处于就绪状态。Java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行
  • 运行状态:如果处于就绪状态的线程获得了CPU,开始执行run()方法的线程执行体,则该线程处于运行状态
  • 阻塞状态:当处于运行状态的线程失去所占用资源之后,便进入阻塞状态
  • 死亡状态:线程在run()方法执行结束后进入死亡状态。此外,如果线程执行了interrupt()或stop()方法,那么它也会以异常退出的方式进入死亡状态。

 

线程池核心参数有哪些?

public ThreadPoolExecutor(
    int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    ThreadFactory threadFactory,
    RejectedExecutionHandler handler
)
{
    ....
}

Java高并发面试题及答案(13道必考题图解)-mikechen

 

线程池任务执行流程?

Java高并发面试题及答案(13道必考题图解)-mikechen

CopyOnWriteArrayList的原理与应用

CopyOnWriteArrayList : 写时加锁,当添加一个元素的时候,将原来的容器进行copy,复制出一个新的容器,然后在新的容器里面写,写完之后再将原容器的引用指向新的容器,而读的时候是读旧容器的数据,所以可以进行并发的读,但这是一种弱一致性的策略。

使用场景:CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。

 

什么是Executors框架?

Executor框架是一个根据一组执行策略调用,调度,执行和控制的异步任务的框架。

无限制的创建线程会引起应用程序内存溢出。所以创建一个线程池是个更好的的解决方案,因为可以限制线程的数量并且可以回收再利用这些线程。利用Executors框架可以非常方便的创建一个线程池。

 

什么是CAS?

CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法