作为各大厂面试的重点之一的Java并发编程不会怎么行!本文结合实际面试题,重点聊聊 Java并发的相关知识点!

面试官为什么都喜欢问并发编程的问题?

synchronized实现原理、CAS无锁化的原理、AQS是什么、Lock锁、ConcurrentHashMap的分段加锁的原理、线程池的原理、java内存模型、volatile说一下吗、对java并发包有什么了解?一连串的问题

写一些java web系统,运用一些框架和一些第三方技术,写一些类似于crud的业务逻辑,把各种技术整合一下,写一些crud而已,没什么技术含量。很多人可能写好几年的代码,都不会用到多少java并发包下面的东西

如果说你要面试一些稍微好一点的公司,技术稍微好一点,你只要去做一个技术含量稍微高一点的系统,并发包下面的东西还是很容易会用到的。尤其是BAT,中大厂,有一定规模的公司,做出来的系统还是有一定的技术含量的。Java 并发问题一直是各个大厂面试的重点之一,但很多人在面试时,常常表示对各种并发原理一脸懵逼,好像知道一些却又讲不清楚,最终导致面试失败。于是发奋学习,啃大部头书又发现理论太多,头疼,今天我就结合实际的面试题,重点聊一聊 Java 并发中的相关知识点,由于内容过多只展示了部分内容,完整的内容已经整理好啦

1、怎么终止一个线程?如何优雅地终止线程?

答:可以用Stop终止,但是不推荐!

2、ReadWriteLock有什么用?

答:ReadWriteLock 是一个读写锁接口,ReentrantReadWriteLock 是 ReadWriteLock 接口的一个具体实现,实现了读写的分离,读锁是共享的,写锁是独占的,读和读之间不会互斥,读和写、写和读、写和写之间才会互斥,提升了读写的性能。

3、什么是阻塞式方法?

答:阻塞式方法是指程序会一直等待该方法完成期间不做其他事情,ServerSocket 的accept()方法就是一直等待客户端连接。这里的阻塞是指调用结果返回之前,当前线程会被挂起,直到得到结果之后才会返回。此外,还有异步和非阻塞式方法在任务完成前就返回。

4、守护线程和用户线程有什么区别呢?

答:

  • 用户 (User) 线程:运行在前台,执行具体的任务,如程序的主线程、连接网络的子线程等都是用户线程
  • 守护 (Daemon) 线程:运行在后台,为其他前台线程服务。也可以说守护线程是 JVM 中非守护线程的 “佣人”。一旦所有用户线程都结束运行,守护线程会随 JVM 一起结束工作

5、线程池中submit()和execute()方法有什么区别?

答:

  • execute() 参数 Runnable ;submit() 参数 (Runnable) 或 (Runnable 和 结果 T) 或 (Callable)
  • execute() 没有返回值;而 submit() 有返回值
  • submit() 的返回值 Future 调用get方法时,可以捕获处理异常

6、FutureTask是什么?

答:FutureTask 表示一个异步运算的任务。FutureTask 里面可以传入一个 Callable 的具体实现类,可以对这个异步运算的任务的结果进行等待获取、判断是否已经完成、取消任务等操作。当然,由于 FutureTask 也是Runnable 接口的实现类,所以 FutureTask 也可以放入线程池中。

7、线程池四种创建方式?

答:Java通过Executors提供四种线程池,分别为:

  • newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
  • newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  • newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
  • newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

8、多线程的好处

答:可以提高 CPU 的利用率。在多线程程序中,一个线程必须等待的时候,CPU 可以运行其它的线程而不是等待,这样就大大提高了程序的效率。也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

9、线程数过多会造成什么异常?

10、什么是阻塞式方法?

答:阻塞式方法是指程序会一直等待该方法完成期间不做其他事情,ServerSocket 的accept()方法就是一直等待客户端连接。这里的阻塞是指调用结果返回之前,当前线程会被挂起,直到得到结果之后才会返回。此外,还有异步和非阻塞式方法在任务完成前就返回。

11、提交任务时线程池队列已满会时发会生什么?

答:当线程数小于最大线程池数 maximumPoolSize 时就会创建新线程来处理,而线程数大于等于最大线程池数 maximumPoolSize 时就会执行拒绝策略。

12、多线程有什么用?

13、中排查多线程问题用什么命令?

jstack

14、简述java垃圾回收机制?

JVM释放没有被引用的内存空间的过程

15、如何避免线程死锁

16、四种构建线程池的区别及特点?

17、如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?

18、原子类的常用类

19、Java中的同步集合与并发集合有什么区别?

20、多线程应用场景

21、线程之间如何通信及线程之间如何同步

22、并发编程有什么缺点

23、简述java类加载机制?

24、什么是守护线程?有什么用?

25、Lock接口和synchronized对比同步它有什么优势?

26、并发编程三个必要因素是什么?

27、一个线程运行时发生异常会怎样?

28、为什么要使用线程池?

29、线程同步需要注意什么?

30、什么叫线程安全?servlet是线程安全吗?

31、volatile能使得一个非原子操作变成原子操作吗?

  • 关键字volatile的主要作用是使变量在多个线程间可见,但无法保证原子性,对于多个线程访问同一个实例变量需要加锁进行同步。
  • 虽然volatile只能保证可见性不能保证原子性,但用volatile修饰long和double可以保证其操作原子性。

32、Thread类中的yield方法有什么作用?

  • 使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。
  • 当前线程到了就绪状态,那么接下来哪个线程会从就绪状态变成执行状态呢?可能是当前线程,也可能是其他线程,看系统的分配了。

33、ThreadPoolExecutor饱和策略有哪些?

34、如何停止一个正在运行的线程?

35、线程池有什么优点?

  • 降低资源消耗:重用存在的线程,减少对象创建销毁的开销。
  • 提高响应速度。可有效的控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
  • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
  • 附加功能:提供定时执行、定期执行、单线程、并发数控制等功能。

36、什么是CAS算法?在多线程中有哪些应用。

37、线程池都有哪些状态?

38、强引用、软引用、弱引用、虚引用的区别?

39、框架是干什么的?

40、Java中能创建volatile数组吗?

41、说说自己是怎么使用synchronized关键字,在项目中用到了吗

42、什么是原子类

43、新建T1、T2、T3三个线程,如何保证它们按顺序执行?

44、为什么你应该在循环中检查等待条件?

45、Java线程数过多会造成什么异常?

46、说一下Atomic的原理?

47、为什么wait/notify/notifyAll这些方法不在thread类里面?

48、重排序遵守的规则

49、java类加载过程?

50、简单说说你了解的类加载器,可以打破双亲委派么,怎么打破。

51、什么是自旋

52、线程的调度策略

53、你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1,包括原理,流程,优缺点。

54、JVM内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存。

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

56、什么是线程调度器(ThreadScheduler)和时间分片(TimeSlicing)?

57、JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代

58、如果你提交任务时,线程池队列已满,这时会发生什么

59、多线程之间如何进行通信?

60、什么是FutureTask

61、保证"可见性"有哪几种方式?

62、中用到了什么线程调度算法?

63、单例模式了解吗?给我解释一下双重检验锁方式实现单例模式!”

64、中堆和栈有什么不同?

65、如何合理分配线程池大小?

66、as-if-serial规则和happens-before规则的区别

67、多线程上下文切换是什么意思?

68、java内存模型

69、常用的并发工具类有哪些?

70、什么是死锁?如何避免死锁?

71、用过ConcurrentHashMap,讲一下他和HashTable的不同之处?

72、线程B怎么知道线程A修改了变量

73、JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor。

74、线程怎样拿到返回结果?

75、CopyOnWriteArrayList的设计思想?

76、是什么?有什么应用场景?

77、如何创建线程安全的单例模式?

78、synchronized和ReentrantLock区别是什么?

79、Collections.synchronized*是什么?

80、volatile关键字的作用

81、线程池启动线程submit()和execute()方法有什么不同?

82、框架使用有哪些要注意的地方?

83、为什么HashTable是线程安全的?

84、和Thread用哪个好?

85、怎么控制同一时间只有3个线程运行?

86、常用的几种线程池并讲讲其中的工作原理。

87、怎么检测一个线程是否拥有锁?

88、什么是线程同步和线程互斥,有哪几种实现方式?

89、说一下synchronized底层实现原理?

90、内存模型是什么,哪些区域是线程共享的,哪些是不共享的?

91、什么是类加载器,类加载器有哪些?

92、synchronized、volatile、CAS比较

93、什么是ThreadPoolExecutor?

94、多线程的常用方法

95、为什么Thread类的sleep()和yield()方法是静态的?

96、什么是Executors?

97、线程和进程的区别是什么?

98、一个线程运行时发生异常会怎样?

99、你经常使用什么并发容器,为什么?

100、为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?

101、类加载器双亲委派模型机制?

102、什么是自旋锁?

103、为什么wait和notify方法要在同步块中调用?

104、并行和并发有什么区别?

105、什么是重入锁?

106、同步方法和同步块,哪个是更好的选择?

107、为什么线程通信的方法wait(),notify()和notifyAll()被定义在Object类里?

108、启动线程方法start()和run()有什么区别?

109、什么是Vector

110、你是如何调用wait()方法的?使用if块还是循环?为什么?

111、什么是并发队列:

112、同步方法和同步块,哪种更好?

113、线程的run()和start()有什么区别?

114、线程池的执行原理?

115、和CountDownLatch的区别?

116、内存模型以及分区,需要详细到每个区放什么。

117、线程的状态

118、finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?

119、synchronized可重入的原理

120、线程池作用?

121、在Java程序中怎么保证多线程的运行安全?

122、为什么wait(),notify()和notifyAll()必须在同步方法或者同步块中被调用?

123、线程类的构造方法、静态块是被哪个线程调用的

124、sleep(0)的作用是什么?

125、synchronized和Lock有什么区别?

126、什么是多线程

127、什么是上下文切换?

128、线程yield()方法有什么用?

129、一个线程的生命周期有哪几种状态?它们之间如何流转的?

130、在Java中Executor和Executors的区别?

131、SynchronizedMap和ConcurrentHashMap有什么区别?

132、你对线程优先级的理解是什么?

133、怎么打出线程栈信息。

134、多线程的劣势

135、创建线程的四种方式

136、Java中ConcurrentHashMap的并发度是什么?

137、Java内存模型

138、线程和进程区别

139、sleep()和wait()有什么区别?

140、的size()方法为什么要做同步?

141、Java实现线程有哪几种方式?

142、多线程同步有哪几种方法?

143、关键字的作用?

144、CAS的会产生什么问题?

145、什么是线程死锁

146、什么是重排序

147、什么是并发容器的实现?

148、如何在两个线程间共享数据?

149、volatile变量和atomic变量有什么不同?

150、说几个常用的Lock接口实现锁。

151、synchronized和volatile的区别是什么?

152、final不可变对象,它对写并发应用有什么帮助?

153、线程的sleep()方法和yield()方法有什么区别?

154、常用并发列队的介绍:

155、详解JVM内存模型

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

157、CopyOnWriteArrayList的使用场景?

158、怎么判断并发队列是阻塞队列还是非阻塞队列

159、在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?

160、中notify和notifyAll有什么区别?

161、CopyOnWriteArrayList的缺点?

162、Java如何实现多线程之间的通讯和协作?

163、Java中垃圾回收有什么目的?什么时候进行垃圾回收?

164、简述java内存分配与回收策率以及MinorGC和MajorGC

165、说说你知道的几种主要的JVM参数

166、为什么要使用并发编程

167、Java中interrupted和isInterrupted方法的区别?

168、notify()和notifyAll()有什么区别?

169、Java中怎么获取一份线程dump文件?你如何在Java中获取线程堆栈?

170、并发队列和并发集合的区别:

171、如何自定义线程线程池?

172、当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?

173、线程之间如何传递数据?

174、java中垃圾收集的方法有哪些?

175、多线程中synchronized锁升级的原理是什么?

176、ArrayList和Vector有什么不同之处?

177、什么是乐观锁和悲观锁?

178、什么是CAS

179、说说线程安全的和不安全的集合。

180、什么是活锁、饥饿、无锁、死锁?

181、线程中的wait()和sleep()方法有什么区别?

182、Java程序中怎么保证多线程的运行安全?

183、不可变对象对多线程有什么帮助?

184、什么是Callable和Future?

185、如何在Windows和Linux上查找哪个线程cpu利用率最高?

186、并发关键字synchronized?

187、怎么唤醒一个阻塞的线程?

188、有哪几种用法?

189、Java中用到的线程调度算法是什么?

190、形成死锁的四个必要条件是什么

191、堆里面的分区:Eden,survival(from+to),老年代,各自的特点。

192、阻塞队列和非阻塞队列区别

193、乐观锁和悲观锁的理解及如何实现,有哪些实现方式?

194、你如何在Java中获取线程堆栈?

195、什么是原子性、可见性、有序性?

196、CopyOnWriteArrayList是什么?

197、线程wait()方法使用有什么前提?

198、什么是线程池?

199、什么情况下会发生栈内存溢出。

200、请说出与线程同步以及线程调度相关的方法。

201、重排序实际执行的指令步骤

202、Java中你怎样唤醒一个阻塞的线程?

总结

编发编程的面试总结到这里就结束了!每道并发编程的答案解析内容就不在这里一一展示了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值