1 Star 0 Fork 31

阿明 / Ebooks

forked from Java精选 / Ebooks 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
最新面试题2021年Java并发面试题及答案汇总.md 10.38 KB
一键复制 编辑 原始数据 按行查看 历史

最新面试题2021年Java并发面试题及答案汇总

全部面试题答案,更新日期:01月30日,直接下载吧!

下载链接:高清500+份面试题资料及电子书,累计 10000+ 页大厂面试题 PDF

Java 并发

题1:Java 支持协程吗?

Java 官方目前是还没推出协程。

目前可用性比较高的有Quasar和ea-async两个第三方库,都是通过byte code Instrument,把编译后同步程序class文件修改为异步的操作。

题2:Java 中如何实现多线程之间的通讯和协作?

中断和共享变量。

题3:什么是守护线程?

守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程,而其他的线程只有一种,那就是用户线程。

java中线程可以划分为2种

1、守护线程,比如垃圾回收线程,就是最典型的守护线程。 2、用户线程,就是应用程序里的自定义线程。

守护线程

1、守护线程,专门用于服务其他的线程,如果其他的线程(即用户自定义线程)都执行完毕,连main线程也执行完毕,那么jvm就会退出(即停止运行)——此时,连jvm都停止运行了,守护线程当然也就停止执行了。

2、如果存在用户自定义线程的话,jvm就不会退出,此时守护线程也不能退出,也就是它还要运行,就是为了执行垃圾回收的任务。

3、守护线程又被称为“服务进程”“精灵线程”“后台线程”,是指在程序运行是在后台提供一种通用的线程,这种线程并不属于程序不可或缺的部分。

通俗点讲,任何一个守护线程都是整个JVM中所有非守护线程的“保姆”。

题4:虚拟机栈和本地方法栈为什么是私有的?

虚拟机栈

每个Java方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在Java虚拟机栈中入栈和出栈的过程。

本地方法栈

和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。 在HotSpot虚拟机中和 Java 虚拟机栈合二为一。

因此,为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地方法栈是线程私有的。

题5:什么是线程组,为什么 Java不推荐使用?

线程组和线程池是两个不同的概念,他们的作用完全不同,前者是为了方便线程的管理,后者是为了管理线程的生命周期,复用线程,减少创建销毁线程的开销。

ThreadGroup类,可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式。

线程组ThreadGroup对象中的stop,resume,suspend会导致安全问题,主要是死锁问题,已经被官方废弃,价值已经大不如以前。

Java不推荐使用,这是因为线程组ThreadGroup不是线程安全的,有很多的安全隐患问题,推荐使用线程池。

题6:synchronized 和 ReentrantLock 有什么区别?

synchronized是和if、else、for、while一样的关键字,而ReentrantLock是类,这是二者的本质区别。

ReentrantLock提供了比synchronized更加灵活的特性,可以被继承,存在方法、变量等,ReentrantLock比synchronized的扩展性体现在以下几点:

1)ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁

2)ReentrantLock可以获取各种锁的信息

3)ReentrantLock可以灵活地实现多路通知

synchronized竞争锁时会一直等待,而ReentrantLock可以尝试获取锁,并得到获取结果。

synchronized获取锁无法设置超时,而ReentrantLock可以设置获取锁的超时时间。

synchronized无法实现公平锁,而ReentrantLock可以满足公平锁,即先等待先获取到锁。

synchronized控制等待和唤醒需要结合加锁对象的wait()和notify()、notifyAll(),而ReentrantLock控制等待和唤醒需要结合Condition的await()和signal()、signalAll()方法。

synchronized是JVM层面实现的;ReentrantLock是JDK代码层面实现。

synchronized锁机制是操作对象头中Mark Word,而ReentrantLock底层调用的是Unsafe的park()方法加锁。

synchronized在加锁代码块执行完或出现异常时自动释放锁;ReentrantLock不会自动释放锁,需要在finally{}代码块显示释放。

题7:什么是FutureTask?

Java并发程序中FutureTask表示一个可以取消的异步运算。

FutureTask有启动和取消运算、查询运算是否完成和取回运算结果等方法。

只有当运算完成的时候结果才能取回,如果运算尚未完成get方法将会阻塞。

一个FutureTask对象可以对调用了Callable和Runnable的对象进行包装,由于FutureTask也是调用了Runnable接口所以它可以提交给Executor来执行。

题8:线程优先级是什么?

每一个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关的(OS dependent)。我们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个int变量(从1-10),1代表最低优先级,10代表最高优先级。

java的线程优先级调度会委托给操作系统去处理,所以与具体的操作系统优先级有关,如非特别需要,一般无需设置线程优先级。

题9:如何避免线程死锁?

死锁有四个必要条件:互斥条件,请求和保持条件,不剥夺条件,循环等待条件。

只需要破坏产生死锁的四个条件中任意一个就可以避免线程死锁,但是互斥条件是没有办法破坏的,因为锁的意义就是想让线程之间存在资源互斥访问。

1)破坏请求与保持条件,一次性申请所有的资源;

2)破坏不剥夺条件,占用部分资源的线程进一步申请其他资源时如果申请不到,使其主动释放占有的资源;

3)破坏循环等待条件,按序申请资源来预防线程死锁,按某一顺序申请资源,释放资源则反序释放。

题10:线程的生命周期包括哪几个阶段?

当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)五种状态。当线程启动以后,它不能一直占用着CPU独自运行,所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换。

线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、死亡。

新建(new Thread)

当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。

就绪(runnable)

线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源

运行(running)

线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。

堵塞(blocked)

由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。

正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。

正在等待:调用wait()方法。(调用motify()方法回到就绪状态)

被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复)

死亡(dead)

当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。

自然终止:正常运行run()方法后终止

异常终止:调用stop()方法让一个线程终止运行

题11:为什么-wait()-和-notify()-方法要在同步块中调用

题12:copyonwritearraylist-可以用于什么应用场景

题13:什么是-callable-和-future

题14:什么是并发容器的实现

题15:什么是并发

题16:如何检测一个线程是否拥有锁

题17:什么是不可变对象对写并发应用有什么帮助

题18:什么是线程死锁

题19:java-中常见的阻塞队列有哪些

题20:java-中-aqs-实现方式是什么

题21:死锁与饥饿都有哪些区别

题22:string变量可以存放在-delayqueue-队列吗

题23:创建线程池的有几种方式

题24:java-中线程阻塞都有哪些原因

题25:java-中-semaphore-是什么

大厂面试题

大厂面试题

大厂面试题

Java
1
https://gitee.com/AminDev/ebooks.git
git@gitee.com:AminDev/ebooks.git
AminDev
ebooks
Ebooks
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891