1 Star 0 Fork 31

tankai / Ebooks

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

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

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

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

Java 并发

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

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

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

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

题2:使用多线程可能带来什么问题?

并发编程的目的就是为了能提高程序的执行效率提高程序运行速度,但是并发编程并不总是能提高程序运行速度的,而且并发编程可能会遇到很多问题。

比如:内存泄漏、上下文切换、死锁还有受限于硬件和软件的资源闲置问题。

题3:如何保证运行中的线程暂停一段时间?

使用Thread类的sleep()方法可以让线程暂停一段时间。

需要注意的是,这并不会让线程终止,一旦从休眠中唤醒线程,线程的状态将会被改变为Runnable,并且根据线程调度,它将得到执行。

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

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

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

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

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

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

题5:什么是乐观锁,什么是悲观锁?

乐观锁

乐观锁的意思是乐观思想,即认为读多写少,遇到并发写的可能性低,每次获取数据时都认为不会被修改,因此不会上锁,但是在更新操作时会判断有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读比较写的操作。

Java中的乐观锁基本上都是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,反之失败。

悲观锁

悲观锁的意思是悲观思想,即认为写多,遇到并发写的可能性高,每次获取数据时都认为会被修改,因此每次在读写数据时都会上锁,在读写数据时就会block直到拿到锁。

Java中的悲观锁就是Synchronized、AQS框架下的锁则是先尝试CAS乐观锁去获取锁,获取不到,才会转换为悲观锁,如RetreenLock。

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

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

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

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

题7:Java 中 AQS 核心思想是什么?

AQS核心思想是如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用。

题8:CopyOnWriteArrayList 可以用于什么应用场景?

CopyOnWriteArrayList(免锁容器)的好处之一是当多个迭代器同时遍历和修改这个列表时,不会抛出ConcurrentModificationException。

在CopyOnWriteArrayList中,写入将导致创建整个底层数组的副本,而源数组将保留在原地,使得复制的数组在被修改时,读取操作可以安全地执行。

1)由于写操作的时候,需要拷贝数组,会消耗内存,如果原数组的内容比较多的情况下,可能导致young gc或者full gc。

2)不能用于实时读的场景,像拷贝数组、新增元素都需要时间,所以调用一个set操作后,读取到数据可能还是旧的,虽然CopyOnWriteArrayList 能做到最终一致性,但是还是没法满足实时性要求;

CopyOnWriteArrayList透露的思想

读写分离,读和写分开 最终一致性 使用另外开辟空间的思路,来解决并发冲突

题9:为什么使用 Executor 框架?

每次执行任务创建线程new Thread()比较消耗性能,创建一个线程是比较耗时、耗资源的。

调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制的创建,线程之间的相互竞争会导致过多占用系统资源而导致系统瘫痪,还有线程之间的频繁交替也会消耗很多系统资源。

使用new Thread()启动的线程不利于扩展,比如定时执行、定期执行、定时定期执行、线程中断等都不便实现。

题10:Java 中延迟阻塞队列的原理是什么?

DelayQueue底层使用了PriorityQueue优先级队列,而PriorityQueue实际上一个二叉堆结构,通过比较堆内元素过期时间,将堆内最快过期的元素放在堆头,以保证每次获取的元素是最二叉堆中最快过期的元素。

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

题12:thread-类中-yield()-方法有什么作用

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

题14:synchronized-和-reentrantlock-有什么区别

题15:synchronousqueue-队列的大小是多少

题16:常用的并发工具类有哪些

题17:并发和并行有什么区别

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

题19:什么是-cas

题20:什么是线程死锁

题21:线程池都有哪些拒绝策略

题22:进程与线程之间有什么区别

题23:如何保证线程按顺序执行

题24:超出-linkedblockingqueue-容量值会出现什么情况

题25:什么是线程局部变量

大厂面试题

大厂面试题

大厂面试题

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

搜索帮助

53164aa7 5694891 3bd8fe86 5694891