从阿里,京东等大厂面试题中提炼出25道最频繁出现的并发编程难题(附答案)

并发编程能够说是Java程序员必须掌握的技能之一,也是最难掌握的一种技能。它要求编程者对计算机最底层的运做原理有深入的理解,同时要求编程者逻辑清晰、思惟缜密,这样才能写出高效、安全、可靠的多线程并发程序。因此不少大厂面试常常会问到关于Java并发编程的问题来考验面试者的水平。那么面试者到底该如何应对呢?这里我经过阿里,京东,字节跳动等大厂的是面试题总结了25道并发编程必问的难题,先把问题列举出来,后面将进行分析以及解答。java

file

synchronized 关键字

synchronized 关键字,表明这个方法加锁,至关于无论哪个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其余同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,而后直接运行。它包括两种用法:synchronized 方法和 synchronized 块。程序员

1. 说一说本身对于 synchronized 关键字的了解web

2. 说说本身是怎么使用 synchronized 关键字,在项目中用到了吗面试

3. 讲一下 synchronized 关键字的底层原理数据库

4. 说说 JDK1.6 以后的synchronized 关键字底层作了哪些优化,能够详细介绍一下这些优化吗编程

5. 谈谈 synchronized和ReentrantLock 的区别数组

volatile关键字

volatile做为java中的关键词之一,用以声明变量的值可能随时会别的线程修改,使用volatile修饰的变量会强制将修改的值当即写入主存,主存中值的更新会使缓存中的值失效(非volatile变量不具有这样的特性,非volatile变量的值会被缓存,线程A更新了这个值,线程B读取这个变量的值时可能读到的并非是线程A更新后的值)。volatile会禁止指令重排。缓存

6. 讲一下Java内存模型安全

7. 说说 synchronized 关键字和 volatile 关键字的区别多线程

ThreadLocal

ThreadLocal翻译成中文比较准确的叫法应该是:线程局部变量。

在并发编程的时候,成员变量若是不作任何处理实际上是线程不安全的,各个线程都在操做同一个变量,显然是不行的,而且咱们也知道volatile这个关键字也是不能保证线程安全的。那么在有一种状况之下,咱们须要知足这样一个条件:变量是同一个,可是每一个线程都使用同一个初始值,也就是使用同一个变量的一个新的副本。这种状况之下ThreadLocal就很是使用,好比说DAO的数据库链接,咱们知道DAO是单例的,那么他的属性Connection就不是一个线程安全的变量。而咱们每一个线程都须要使用他,而且各自使用各自的。这种状况,ThreadLocal就比较好的解决了这个问题。

8. ThreadLocal简介

9. ThreadLocal示例

10. ThreadLocal原理

11. ThreadLocal 内存泄露问题

线程池

线程池是一种多线程处理形式,处理过程当中将任务添加到队列,而后在建立线程后自动启动这些任务。线程池线程都是后台线程。每一个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。若是某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另外一个辅助线程来使全部处理器保持繁忙。若是全部线程池线程都始终保持繁忙,但队列中包含挂起的工做,则线程池将在一段时间后建立另外一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程能够排队,但他们要等到其余线程完成后才启动。

12. 为何要用线程池?

13. 实现Runnable接口和Callable接口的区别

14. 执行execute()方法和submit()方法的区别是什么呢?

15. 如何建立线程池

16. ThreadPoolExecutor 类分析

17. 一个简单的线程池Demo:Runnable ThreadPoolExecutor

18. 线程池原理分析

Atomic 原子类

在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量i=1,好比多个线程执行i 操做,就有可能获取不到正确的值,而这个问题,最经常使用的方法是经过Synchronized进行控制来达到线程安全的目的。可是因为synchronized是采用的是悲观锁策略,并非特别高效的一种解决方案。实际上,在J.U.C下的atomic包提供了一系列的操做简单,性能高效,并能保证线程安全的类去更新基本类型变量,数组元素,引用类型以及更新对象中的字段类型。atomic包下的这些类都是采用的是乐观锁策略去原子更新数据,在java中则是使用CAS操做具体实现。

19.介绍一下Atomic 原子类

20. JUC 包中的原子类是哪4类?

21. 讲讲 AtomicInteger 的使用

22. 能不能给我简单介绍一下 AtomicInteger 类的原理

AQS

AQS是AbstractQueuedSynchronizer的简称。AQS提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架,以下图所示。AQS为一系列同步器依赖于一个单独的原子变量(state)的同步器提供了一个很是有用的基础。子类们必须定义改变state变量的protected方法,这些方法定义了state是如何被获取或释放的。鉴于此,本类中的其余方法执行全部的排队和阻塞机制。子类也能够维护其余的state变量,可是为了保证同步,必须原子地操做这些变量。file

23. AQS 介绍

24. AQS 原理分析

25. AQS 组件总结

面试题答案

好了,Java并发编程中的面试难题一共就这么多,只要解决这些难题,剩下也就就都迎刃而解了。面试题领取方式:关注宫众浩【java开发之路】回复【资料】便可得到完整版面试题答案。