JAVA面试大全之并发篇

目录

1、并发基础

1.1、多线程的出现是要解决什么问题的? 本质什么?

1.2、Java是怎么解决并发问题的?

1.3、线程安全有哪些实现思路?

1.4、如何理解并发和并行的区别?

1.5、线程有哪几种状态? 分别说明从一种状态到另一种状态转变有哪些方式?

1.6、通常线程有哪几种使用方式?

1.7、基础线程机制有哪些?

1.8、线程的中断方式有哪些?

1.9、线程的互斥同步方式有哪些? 如何比较和选择?

1.10、线程之间有哪些协作方式?

2、并发关键字

2.1、Synchronized可以作用在哪里?

2.2、Synchronized本质上是通过什么保证线程安全的?

2.3、Synchronized使得同时只有一个线程可以执行,性能比较差,有什么提升的方法?

2.4、Synchronized由什么样的缺陷? Java Lock是怎么弥补这些缺陷的?

2.5、Synchronized和Lock的对比,和选择?

2.6、Synchronized在使用时有何注意事项?

2.7、Synchronized修饰的方法在抛出异常时,会释放锁吗?

2.8、多个线程等待同一个Synchronized锁的时候,JVM如何选择下一个获取锁的线程?

2.9、synchronized是公平锁吗?

2.10、volatile关键字的作用是什么?

2.11、volatile能保证原子性吗?

2.12、32位机器上共享的long和double变量的为什么要用volatile?

2.13、volatile是如何实现可见性的?

2.14、volatile是如何实现有序性的?

2.15、说下volatile的应用场景?

2.16、所有的final修饰的字段都是编译期常量吗?

2.17、如何理解private所修饰的方法是隐式的final?

2.18、说说final类型的类如何拓展?

2.19、final方法可以被重载吗?

 2.20、父类的final方法能不能够被子类重写?

2.21、说说基本类型的final域重排序规则?

2.22、说说final的原理?

3、JUC全局观

3.1、JUC框架包含几个部分?

3.2、Lock框架和Tools哪些核心的类?

3.3、JUC并发集合哪些核心的类?

3.4、JUC原子类哪些核心的类?

3.5、JUC线程池哪些核心的类?

4、JUC原子类

4.1、线程安全的实现方法有哪些?

4.2、什么是CAS?

4.3、CAS使用示例,结合AtomicInteger给出示例?

4.4、CAS会有哪些问题?

4.5、AtomicInteger底层实现?

4.6、请阐述你对Unsafe类的理解?

4.7、说说你对Java原子类的理解? 

4.8、AtomicStampedReference是怎么解决ABA的?

5、 JUC锁

5.1、为什么LockSupport也是核心基础类?

5.2、通过wait/notify实现同步?

 5.3、通过LockSupport的park/unpark实现同步?

5.4、Thread.sleep()、Object.wait()、Condition.await()、LockSupport.park()的区别? 重点

5.5、如果在wait()之前执行了notify()会怎样?

5.6、如果在park()之前执行了unpark()会怎样?

5.7、什么是AQS? 为什么它是核心?

5.8、AQS的核心思想是什么?

5.9、AQS有哪些核心的方法?

 5.10、AQS定义什么样的资源获取方式?

5.11、AQS底层使用了什么样的设计模式?

5.12、什么是可重入,什么是可重入锁? 它用来解决什么问题?

5.13、ReentrantLock的核心是AQS,那么它怎么来实现的,继承吗?

5.14、ReentrantLock是如何实现公平锁的?

5.15、ReentrantLock是如何实现非公平锁的?

5.16、ReentrantLock默认实现的是公平还是非公平锁?

5.17、为了有了ReentrantLock还需要ReentrantReadWriteLock?

5.18、ReentrantReadWriteLock底层实现原理?

5.19、ReentrantReadWriteLock底层读写状态如何设计的?

5.20、读锁和写锁的最大数量是多少?

5.21、本地线程计数器ThreadLocalHoldCounter是用来做什么的?

5.22、写锁的获取与释放是怎么实现的?

5.23、读锁的获取与释放是怎么实现的?        

5.24、什么是锁的升降级?

6、JUC集合类

6.1、为什么HashTable慢? 它的并发度是什么? 那么ConcurrentHashMap并发度是什么?

6.2、ConcurrentHashMap在JDK1.7和JDK1.8中实现有什么差别? JDK1.8解決了JDK1.7中什么问题

6.3、ConcurrentHashMap JDK1.7实现的原理是什么?

6.4、ConcurrentHashMap JDK1.7中Segment数(concurrencyLevel)默认值是多少? 为何一旦初始化就不可再扩容?

6.5、ConcurrentHashMap JDK1.7说说其put的机制?

6.6、ConcurrentHashMap JDK1.7是如何扩容的?

6.7、ConcurrentHashMap JDK1.8实现的原理是什么?

6.8、ConcurrentHashMap JDK1.8是如何扩容的?

6.9、ConcurrentHashMap JDK1.8链表转红黑树的时机是什么? 临界值为什么是8?

6.10、ConcurrentHashMap JDK1.8是如何进行数据迁移的?

6.11、先说说非并发集合中Fail-fast机制?

6.12、CopyOnWriteArrayList的实现原理?

6.13、弱一致性的迭代器原理是怎么样的?

6.14、CopyOnWriteArrayList为什么并发安全且性能比Vector好?

6.15、CopyOnWriteArrayList有何缺陷,说说其应用场景?

6.16、要想用线程安全的队列有哪些选择?

6.17、ConcurrentLinkedQueue实现的数据结构?

6.18、ConcurrentLinkedQueue底层原理?

6.19、ConcurrentLinkedQueue的核心方法有哪些?

6.20、说说ConcurrentLinkedQueue的HOPS(延迟更新的策略)的设计?

6.21、ConcurrentLinkedQueue适合什么样的使用场景?

6.22、什么是BlockingDeque? 适合用在什么样的场景?

6.23、BlockingQueue大家族有哪些?

6.24、BlockingQueue常用的方法?

6.25、BlockingQueue 实现例子?

6.26、什么是BlockingDeque? 适合用在什么样的场景?

6.27、BlockingDeque 与BlockingQueue有何关系,请对比下它们的方法?

6.28、BlockingDeque大家族有哪些?

6.29、BlockingDeque 实现例子?

7、JUC线程池 

7.1、FutureTask用来解决什么问题的? 为什么会出现?

7.2、FutureTask类结构关系怎么样的?

7.3、FutureTask的线程安全是由什么保证的?

7.4、FutureTask通常会怎么用? 举例说明。

7.5、为什么要有线程池?

7.6、Java是实现和管理线程池有哪些方式? 请简单举例如何使用。

7.7、ThreadPoolExecutor的原理?

7.8、ThreadPoolExecutor有哪些核心的配置参数? 请简要说明

7.9、ThreadPoolExecutor可以创建哪是哪三种线程池呢?

7.10、当队列满了并且worker的数量达到maxSize的时候,会怎么样?

7.11、说说ThreadPoolExecutor有哪些RejectedExecutionHandler策略? 默认是什么策略?

7.12、简要说下线程池的任务执行机制?

7.13、线程池中任务是如何提交的?

7.14、线程池中任务是如何关闭的?

7.15、在配置线程池的时候需要考虑哪些配置因素?

7.16、如何监控线程池的状态?

7.17、为什么很多公司不允许使用Executors去创建线程池? 那么推荐怎么使用呢?

7.18、ScheduledThreadPoolExecutor要解决什么样的问题?

7.19、ScheduledThreadPoolExecutor相比ThreadPoolExecutor有哪些特性?

7.20、ScheduledThreadPoolExecutor有什么样的数据结构,核心内部类和抽象类?

7.21、ScheduledThreadPoolExecutor有哪两个关闭策略? 区别是什么?

7.22、ScheduledThreadPoolExecutor中scheduleAtFixedRate 和 scheduleWithFixedDelay区别是什么?

7.23、为什么ThreadPoolExecutor 的调整策略却不适用于 ScheduledThreadPoolExecutor?

7.24、Executors 提供了几种方法来构造 ScheduledThreadPoolExecutor?

7.25、Fork/Join主要用来解决什么样的问题?

7.26、Fork/Join框架是在哪个JDK版本中引入的?

7.27、Fork/Join框架主要包含哪三个模块? 模块之间的关系是怎么样的?

7.28、ForkJoinPool类继承关系?

7.29、ForkJoinTask抽象类继承关系?

7.30、整个Fork/Join 框架的执行流程/运行机制是怎么样的?

7.31、具体阐述Fork/Join的分治思想和work-stealing 实现方式?

7.32、有哪些JDK源码中使用了Fork/Join思想?

7.33、如何使用Executors工具类创建ForkJoinPool?

7.34、写一个例子: 用ForkJoin方式实现1+2+3+...+100000?

7.35、Fork/Join在使用时有哪些注意事项? 结合JDK中的斐波那契数列实例具体说明。

 8、JUC工具类

8.1、什么是CountDownLatch?

8.2、CountDownLatch底层实现原理?

8.3、CountDownLatch一次可以唤醒几个任务?

8.4、CountDownLatch有哪些主要方法?

8.5、写道题:实现一个容器,提供两个方法,add,size 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束?

8.6、什么是CyclicBarrier?

8.7、CountDownLatch和CyclicBarrier对比?

8.8、什么是Semaphore?

8.9、Semaphore内部原理?

8.10、Semaphore常用方法有哪些? 如何实现线程同步和互斥的?

8.11、单独使用Semaphore是不会使用到AQS的条件队列?

8.12、Semaphore初始化有10个令牌,11个线程同时各调用1次acquire方法,会发生什么?

8.13、Semaphore初始化有10个令牌,一个线程重复调用11次acquire方法,会发生什么?

8.14、Semaphore初始化有1个令牌,1个线程调用一次acquire方法,然后调用两次release方法,之后另外一个线程调用acquire(2)方法,此线程能够获取到足够的令牌并继续运行吗?

8.15、Semaphore初始化有2个令牌,一个线程调用1次release方法,然后一次性获取3个令牌,会获取到吗?

8.16、Phaser主要用来解决什么问题?

8.17、Phaser与CyclicBarrier和CountDownLatch的区别是什么?

8.18、Phaser运行机制是什么样的?

8.19、给一个Phaser使用的示例?

8.20、Exchanger主要解决什么问题?

8.21、对比SynchronousQueue,为什么说Exchanger可被视为 SynchronousQueue 的双向形式?

8.22、Exchanger在不同的JDK版本中实现有什么差别?

8.23、Exchanger实现举例

8.24、什么是ThreadLocal? 用来解决什么问题的?

8.25、说说你对ThreadLocal的理解

8.26、ThreadLocal是如何实现线程隔离的?

8.27、为什么ThreadLocal会造成内存泄露? 如何解决

8.28、还有哪些使用ThreadLocal的应用场景?

9、Java面试题总述


致力于一个专栏将Java面试说的清清楚楚,从工作实践角度出发,尽量涵盖Java主流知识点,全面讲述Java面试题。

本篇讲述Java并发和多线程,总共涵盖8个知识点,161道热点面试题。

1、并发基础

1.1、多线程的出现是要解决什么问题的? 本质什么?

CPU、内存、I/O 设备的速度是有极大差异的,为了合理利用 CPU 的高性能,平衡这三者的速度差异,计算机体系结构、操作系统、编译程序都做出了贡献,主要体现为:

  • CPU 增加了缓存,以均衡与内存的速度差异;// 导致可见性问题
  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hao_kkkkk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值