前言
众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试的必问题,一个好的Java程序员是必须对并发编程这块有所了解的。
然而不论是哪个国家,什么背景的 Java 开发者,都对自己写的并发程序相当自信,但也会在出问题时表现得很诧异甚至一筹莫展。
可见,Java 并发编程显然不是一件能速成的能力,基础打得越好,越全面,在实践中才会有更深刻的理解。
因此,大家不难发现 Java 并发问题一直是各个大厂面试的重点之一。我在平时的面试中,也发现很多候选人对一些基本的并发概念表示没听过,或原理不理解,可能知道一些却又讲不清楚,最终导致面试失败。
本文会结合实际中接触到的一些面试题,重点来聊一聊 Java 并发中的相关知识点。
Synchronized 相关问题
问题一:Synchronized 用过吗,其原理是什么?
问题二:你刚才提到获取对象的锁,这个“锁”到底是什么?如何确定对象的锁?
问题三:什么是可重入性,为什么说 Synchronized 是可重入锁?
问题四:JVM 对 Java 的原生锁做了哪些优化?
问题五:为什么说 Synchronized 是非公平锁?
问题六:什么是锁消除和锁粗化?
问题七:为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是
问题八:乐观锁一定就是好的吗?
可重入锁 ReentrantLock 及其他显式锁相关问题
问题一:跟 Synchronized 相比,可重入锁 ReentrantLock 其实现原理有什么不同?
问题二:那么请谈谈 AQS 框架是怎么回事儿?
问题三:请尽可能详尽地对比下 Synchronized 和 ReentrantLock 的异同。
问题四:ReentrantLock 是如何实现可重入性的?
问题五:除了 ReetrantLock,你还接触过 JUC 中的哪些并发工具?
问题六:请谈谈 ReadWriteLock 和 StampedLock。
问题七:如何让 Java 的线程彼此同步?你了解过哪些同步器?请分别介绍下。
问题八:CyclicBarrier 和 CountDownLatch 看起来很相似,请对比下呢?
Java 线程池相关问题
问题一:Java 中的线程池是如何实现的?
问题二:创建线程池的几个核心构造参数?
问题三:线程池中的线程是怎么创建的?是一开始就随着线程池的启动创建好的吗?
问题四:既然提到可以通过配置不同参数创建出不同的线程池,那么 Java 中默认实现好的线程池又有哪些呢?请比较它们的异同。
问题五:如何在 Java 线程池中提交线程?
Java 内存模型相关问题
问题一:什么是 Java 的内存模型,Java 中各个线程是怎么彼此看到对方的变量的?
问题二:请谈谈 volatile 有什么特点,为什么它能保证变量对所有线程的可见性?
问题三:既然 volatile 能够保证线程间的变量可见性,是不是就意味着基于 volatile 变量的运算就是并发安全的?
问题四:请对比下 volatile 对比 Synchronized 的异同。
问题五:请谈谈 ThreadLocal 是怎么解决并发安全的?
问题六:很多人都说要慎用 ThreadLocal,谈谈你的理解,使用 ThreadLocal 需要注意些什么?
如何学习并发编程
学习java并发就像进入了另外一个学习领域,就像学习一门新的编程语言,或者是学习一套新的语言概念,要理解并发编程,其难度跟理解面向对象编程难度差不多。你花一点功夫,就可以理解它的基本机制,但是要想真正掌握它的本质,就需要深入的学习与理解。最后在分享一个并发编程知识的学习导图给大家!
2019版多线程与高并发(马士兵)
各位同学,大家好,这是首次使用比较口语化的文字形成-本书,其实也不知道效果如何,希望各位收到书本后能够多提意见和建议。同时也请大家体谅,由于时间关系和忙碌程度,暂时只能总结成为口语化的形式,后面时间充裕了,将会以书面语言的方式进行重新更新。
第一节:线程的基本概念
首先给大家交代- -下我们2019年这个版本给大家讲哪些内容,这个版本主要集中在多线程和高并发这两大块,这两大块儿是现在面试问的越来越多,也是相对-一个初级的程序员向中高级迈进的必须要踏过的一-个坎儿。
第二节: volatile与CAS
volatile
我们先来看这个volatile的概念,volatile它是什么意思。现在像大的互联网企业的面试,基本上volatile是必会的,有时候他也不会太问,认为你应该会,但是中小企业也就开始问这方面的问题。
我们来看一下这个小程序,写了-一个方法啊,首先定义了-个变布尔类型等于true ,这里模拟的是一个服务器的操作,我的值为true你就给我不间断的运行,什么时候为false你再停止。测试new Thread启动-个线程,调用m方法,睡了-秒,最后running等于false ,运行方法他是不会停止的。如果你要把volatile打开,那么结果就是启动程序-秒之后他就会m end停止。( volatile就是不停的追踪这个值,时刻看什么时候发生了变化)
第三节: Atomic类和线程同步新机制
今天,我们继续讲-个Atomic的问题 ,然后开始讲除synchronized之外的别的锁。在前面内容我们讲了synchronized. volatile. Atomic和CAS , Atomic我们只是讲了-个开头还没有讲完,今天我们继续。
像原来我们写m++你得加锁,在多线程访问的情况下,那现在我们可以用Atomicinteger了,它内部就已经帮我们实现了原子操作。直接写count. incrementAndGet(: /count1++这个就相当于count++.原来我们对count是需要加锁的, 现在就不需要加锁了。
我们看下面小程序,模拟,我们计一个数,所有的线程都要共同访问这个数count值,大家知道如果所有线程都要访问这个数的时候,如果每个线程给它往上加了10000 ,你这个时候是需要加锁的,不加锁会出问题。但是,你把它改成AtomicInteger之后就不用在做加锁的操作了,因为incrementAndGet内部用了cas操作,直接无锁的操作往上递增,有同学可能会讲为什么要用无锁操作啊,原因是无锁的操作效率会更高。
第四节: LockSupport、淘宝面试题与源码阅读方法论
首先我们简单回顾一下前面三节课讲的内容 ,分别有线程的基本概念、synchronized. volatile.AtomicXXX、各种JUC同步框架(ReentrantLock. CountDownLatch. CyclicBarrier, Phaser.ReadWriteLock- StampedLock. Semaphore. Exchanger. LockSupport) ,其中synchornized重点讲了-下,包括有synchor nized的底层实现原理、锁升级的概念(四种状态:无锁、偏向锁、轻量级锁重量级锁) , volatile我们讲了可见性和禁止指令重排序如何实现。
第五节: AQS源码阅读与强软弱虚4种引用以及ThreadLocal原理与源码
今天咱们继续讲AQS的源码,在上节课我教大家怎么阅读AQS源码。跑不起来的不读。解决问题就好一目的性。- -条线索到底、无关细节略过,读源码的时候应该先读骨架,比如拿AQS来说,你需要了解AQS是这么一一个数据结构,你读源码的时候读起来就会好很多, 在这里需要插-句,从第一章到本章,章章的内容都是环环相扣的,没学习前边,建议先去补习- -下前面的章节。
第六节:并发容器
今天是第六天了,这节课本来想上-个大而全的课,后来发现这个实在目标太大了,大而全的概念就是上节课讲到的那张容器图中的每一个都讲的非常的细致,然后去谈他们的源码。但是如果这么讲的话我们高井发的课就讲不完了,所以也别着急,后面单独开门课来讲集合,集合的发展历程,现在为什么讲这个并发容器呢,主要是为了线程池做准备,线程池里有一个参数就是用并发容器来做你工作任务的容器。
第七节:线程池
今天这节课呢,我们通过- -道面试把前面讲的哪些基础复习一下,然后再开始线程池这部分的内容,我们一点一点来看。
这道面试题呢实际上是华为的一-道面试题,其实它里面是一道填空题 ,后来就很多的开始考这道题,这个面试题是两个线程,第一个线程是从1到26 ,第二个线程是从A到- -直到Z ,然后要让这两个线程做到同时运行,交替输出,顺序打印。那么这道题目的解法有非常多。
第八节:线程池与源码阅读
第一个我们讲了一个Executor这个接口,大家回顾-下这个接口是干什么使的,把线程的定义和执行分开,主要来做线程的执行接口。在这他下面有一个整个的这 个线程池的生命周期,它里面的方法都给他定义全的接口ExecutorService ,他下面还有AbstractExecutor这个没有和大家说,这个无所谓了,是为了哪些个子类做准备的。
第九节: JMH与Disruptor
今天我们讲两个内容,第一个是IMH ,第二个是Disruptor.这两个内容是给大家做更进一步的这种多线程和高并发的一些专业上的处理。生产环境之中我们很可能不自己定义消息队列,而是使用Disruptor.我们生产环境做测试的时候也不是像我说的那样写一个start写一 个end就测试完了。 在这里给大家先介绍专业的MH测试工具,在给大家介绍Disruptor号称最快的消息队列。
因文件资料过多就不给大家一一展示了 需要获取这份马士兵老师著作的多线程与高并发书籍 及更多马士兵老师的学习视频可以点击此处来获取就可以了!
结语
最后我把这些实际遇到的并发编程面试题及常见问题的答案总结了一下,由于文字过多,就单独做了一个文档。以及准备了一些更多关于Kafka、Mysql、Tomcat、Docker、Spring、MyBatis、Nginx、Netty、Dubbo、Redis、Netty、Spring cloud、分布式、高并发、性能调优、微服务等架构面试题和架构资料在群里免费分享,如有需要的朋友的可以来免费领取,同时可以转发下和关注,以后还会分享更多干货的!