1 Star 0 Fork 31

霍月龙 / Ebooks

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

最新60道面试题2021年常见Java并发面试题及答案汇总

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

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

Java 并发

题1:什么是线程调度器和时间分片?

线程调度器(Thread Scheduler)是一个操作系统服务,它负责为Runnable状态的线程分配CPU时间。一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。

同上一个问题,线程调度并不受到Java虚拟机控制,所以由应用程序来控制它是更好的选择(也就是说不要让你的程序依赖于线程的优先级)。

时间分片(Time Slicing)是指将可用的CPU时间分配给可用的Runnable线程的过程。分配CPU时间可以基于线程优先级或者线程等待的时间。

题2:Java 中 interrupted 和 isInterrupted 方法有什么区别?

interrupt

interrupt方法用于中断线程。调用该方法的线程的状态为将被置为”中断”状态。

注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。

interrupted

查询当前线程的中断状态,并且清除原状态。如果一个线程被中断了,第一次调用interrupted则返回true,第二次和后面的就返回false了。

isInterrupted

仅仅是查询当前线程的中断状态。

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

当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,它要经过新建(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()方法让一个线程终止运行

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

同步容器:可以简单地理解为通过synchronized来实现同步的容器,如果有多个线程调用同步容器的方法,它们将会串行执行。比如Vector,Hashtable,以及Collections.synchronizedSet,synchronizedList等方法返回的容器。

可以通过查看Vector,Hashtable等这些同步容器的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并在需要同步的方法上加上关键字synchronized。

并发容器使用了与同步容器完全不同的加锁策略来提供更高的并发性和伸缩性,例如在ConcurrentHashMap中采用了一种粒度更细的加锁机制,可以称为分段锁,在这种锁机制下,允许任意数量的读线程并发地访问map,并且执行读操作的线程和写操作的线程也可以并发的访问map,同时允许一定数量的写操作线程并发地修改map,所以它可以在并发环境下实现更高的吞吐量。

题5:什么是线程池?

线程池就是创建若干个可执行的线程放入一个池(容器)中,有任务需要处理时,会提交到线程池中的任务队列,处理完之后线程并不会被销毁,而是仍然在线程池中等待下一个任务。

题6:Java 支持协程吗?

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

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

题7:SynchronousQueue 队列的大小是多少?

实际上SynchronousQueue本身是没有容量的大小,所以也无法查看其容量的大小,其内部的size方法都是写死的返回0值。

题8:什么是线程局部变量?

ThreadLocal并非是一个线程本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更合适。

线程局部变量(ThreadLocal)功能非常简单,就是为每一个使用该变量的线程都提供了一个变量值副本,是Java中一种较为特殊的线程绑定机制,使得每一个线程都独立地改变所具有的副本,而不会和其他线程的副本冲突。

题9:Java 中 volatile 和 synchronized 有什么区别?

volatile关键字能够保证数据的可见性,但不能保证数据的原子性。

synchronized关键字既能够保证数据的可见性,又能够保证数据的原子性,即保证资源的同步。

volatile关键字只能用于修饰变量,而synchronized关键字可以修饰方法以及代码块。

题10:Java 中 Executor 和 Executors 有什么区别?

Executors工具类的不同方法按照我们的需求创建了不同的线程池,来满足业务的需求。

Executor接口对象能执行我们的线程任务。

ExecutorService接口继承了Executor接口并进行了扩展,提供了更多的方法我们能获得任务执行的状态并且可以获取任务的返回值。

使用ThreadPoolExecutor可以创建自定义线程池。

Future 表示异步计算的结果,他提供了检查计算是否完成的方法,以等待计算的完成,并可以使用get()方法获取计算的结果。

题11:什么是进程

题12:java-中-volatile-关键字有什么作用

题13:notify()-和-notifyall()-方法有什么区别

题14:java-中无锁队列的原理是什么

题15:程序计数器为什么是私有的

题16:什么是线程组为什么-java不推荐使用

题17:java-中如何唤醒一个阻塞的线程

题18:如何保证两个线程间共享数据

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

题20:什么是并发

题21:sleep()-方法和-wait()-方法有什么区别和共同点

题22:thread-类中-start()-和-run()-方法有什么区别

题23:java-中如何获取线程堆栈

题24:concurrenthashmap-和-hashtable-有什么区别

题25:什么是守护线程

大厂面试题

大厂面试题

大厂面试题

Java
1
https://gitee.com/huo-yuelong/ebooks.git
git@gitee.com:huo-yuelong/ebooks.git
huo-yuelong
ebooks
Ebooks
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891