副本_未命名.jpg

原创声明

本文首发于微信公众号【程序员黄小斜】

本文作者:黄小斜

转载请务必在文章开头注明出处和作者。

本文思维导图

Java并发编程

为什么要学习并发编程

最近的你有没有参加Java面试呢?你有没有发现,Java面试中总是爱考一类问题,那就是并发编程,为什么对并发编程的考察会如此受欢迎呢,这是因为,高并发技术本身就是互联网公司经常使用的东西。

Java作为对并发支持较好的一门语言,可以使用于很多高并发的场景,比如电商,比如秒杀等等常见的互联网应用,都涉及到很多并发技术。

也许有的朋友会说,我做的东西天天都是CRUD,连个thread都用不到,多线程基本都不需要会,何谈并发编程。

其实,就算你平时做的东西不涉及高并发,但是多了解了解JDK里的并发技术还是没有坏处的,比如JUC这个并发包里都有哪些东西,又或者Java底层到底是如何实现并发技术的。

有了这些知识储备之后,即使以后遇到这类面试题或者是接触到这类应用场景,相信你也能够更加地得心应手。

也有的朋友会问,Java并发编程,不就是多线程么,掌握了Thread和Runnable的用法就行了吧,然后会用一下synchronized的关键字,面试的时候应该就可以高枕无忧了?

非也,现在Java市场人才济济,竞争激烈,往往只有优质人才才能脱颖而出,特别是对于想进一些大公司的朋友来说,不好好了解Java并发技术和原理的话,是很难做到的。

除了多线程基础之外,你还需要了解线程池、JUC里的并发工具类,比如锁、阻塞队列的使用,再进一步,还需要了解并发技术的底层原理。

为什么JVM虚拟机可以支持并发,为什么可以实现多线程并发,并且做到线程之间的数据隔离和共享,又如何确保线程安全。

在接下来的内容中,我就将带大家一步步了解,Java并发编程到底应该怎么学,并且推荐一些不错的学习资源,提供给大家参考。

如何学习Java并发编程

多线程的基础

第一次接触Java多线程,还是在大学课堂上,当时有一堂课就是介绍Java多线程的,学习编程语言注重实践,于是老师写了一个程序来模拟多线程的运行方式。

程序大概是这样子的,老师开启了五个线程,每个线程里的运行逻辑都是让马往前跑1米,并且直到终点才停下。

程序开始时,同时启动五个线程,五匹马分别往前跑,有意思的是,每次运行的结果都不一样,有的时候第一只马跑得最快,有的时候却跑得最慢。

这是为什么呢,原因很简单,学过多线程的朋友多知道,线程的调度是随机的,5个线程同时启动,也没有设置优先级,系统就会随机地进行调度。

虽然多线程的调度是系统随机的,但是JDK里仍然提供了很多方法允许我们人为干预它的运行,大家都知道线程有很多状态,而Thread类也有很多方法,包括类方法和实例方法,比如Thread.sleep就是了类方法,可以让当前线程休眠,而wait则是实例方法,可以让该线程让出锁资源。

要想学好并发编程,那么对于Java多线程基础的掌握就显得很重要了,对于Thread的方法要知道有什么作用,对于线程的状态转换也要能够搞懂。

当然,我刚刚学习多线程的时候也没有搞懂这些内容,大多时候都是以攻克面试题为目的,死记硬背多了,反而不利于对于基础知识的掌握。

搞定并发面试题,重在理解原理

对于Java程序员来说,最高效的复习方法可能就是刷面试题了,面试前刷几天题,把常见的题型背一背,记一记,应付一些小公司的面试绰绰有余,毕竟那些面试官可能还没有你对这些题目来得熟悉。

像是一些常考的面试题,比如“synchronized和lock“的区别,如何实现线程安全的单例模式,再或者是volatile关键字的使用,如何实现线程安全等等,这类题目不能说很简单,但是确实考的比较多,熟读唐诗三百首,不用作诗也会吟。

但是当你要面试一些大公司时,这些临阵磨枪的套路可能就不太好使了。

阿里和美团都是Java大厂,他们对应聘者Java能力的考察也是非常高的,对于Java并发编程,他们才不会简单地问你上面那些肤浅的题目,即使问了,也能一直往下深挖你的知识深度,比如问到lock和synchronize的区别,他就会问你,synchronized的底层实现原理是什么,lock的实现原理又是什么。

而lock的实现原理其实是很复杂的,因为lock是JUC里的一个类,它背后的实现需要阻塞队列AQS、CAS操作,以及一系列数据结构和算法作为支撑,它的源码就在JDK里,如果你没有真正去了解去看过源码,可能你完全不知道Lock背后居然有这么多复杂的东西。

而且,当你搞懂了并发的原理之后,你再也不需要去死记硬背这些面试题了,毕竟你已经掌握了核心技术,上面的东西自然也更好理解,即使过了很长时间之后,面对此类万变不离其宗的办法面试题,你也可以根据你的现有知识体系很好地做出回答。

Java并发编程原理和源码实现

这里不得不提到基本专门介绍Java并发编程的书籍了,一本是Java作者自己写的《Java并发编程实战》还有一本是我自己看的《Java并发编程艺术》

想要系统地学习并发编程原理,看书是必不可少的方法。

这里我们也不妨按照《Java并发编程实战》这本书的脉络来看看Java并发编程到底都有哪些内容。
以下内容就是按照这本书进行拆解后梳理出来的脉络,按照这个顺序进行阅读和复习,效果应该还不错。

首先,我们要先了解线程的基本知识,线程和进程的区别是什么,Java中的线程和操作系统的线程是什么关系。

接着,我们要了解Java中多线程探讨的几个重点,一个是线程安全的概念和实现方法,以及JDK中并发包的一些实现,比并发容器concurrenthashmap和copyonwritelist,阻塞队列以及同步工具类。

除此之外,并发包中还有一个重要的组成部分,就是线程池,其实线程池也是通过锁、阻塞队列、同步工具类等一起实现的,这部分内容还将带你了解线程池的使用方法以及核心API。

最后的内容就来到了我们的显示锁Lock了,这部分内容也是最为复杂的一部分内容,毕竟要在JDK里实现一个锁,确实并非易事。而事实上,很多的JUC工具类比如闭锁、信号量等都是通过显示锁Lock、阻塞队列等来实现的,这些内容环环相扣,一环扣一环,所以系统性地学习这部分内容,可以让你的知识体系更完整。

其实,本书对于源码的讲解并不多,倒是有很多博客对于并发包的原理做了很多讲解,我之前也是跟着博客学习,才把很多难啃的源码搞定的,其中就包括Lock锁、AQS、并发工具类,甚至是线程池等等,这里要推荐JavaDoop的博客,他对于并发包的源码讲解给了我很大的帮助。

推荐资源

书籍

《Java并发编程艺术》
《Java并发编程实战》

视频

我整理了一些Java并发编程方面的学习视频,分享给大家,其实这方面的视频资源并不多,毕竟大多数视频还是讲项目或者基础为主,能把Java并发编程讲透讲好的人确实不多。

博客

Java技术仓库《Java程序员复习指南》
https://github.com/h2pl/Java-Tutorial
整合全网优质Java学习内容,帮助你从基础到进阶系统化复习Java

JavaDoop 一个资深Java工程师的个人博客,有很多不错的源码解析文章

这里重点推荐两个社区,实打实的有很多干货,对文章要求比较高,我的很多文章质量都达不到他们的要求。

1、掘金
https://juejin.im/user/5b1d0d34e51d4506d936f561

2、开发者头条 https://toutiao.io/subjects/329410

总结

关于如何学习Java并发编程,并且搞定相关面试题,我们今天就讲到这里了,如果还有什么疑问也可以到我公众号【程序员黄小斜】里找我探讨,后续会有更多的文章推出,包括如何系统性地学习JavaWeb,敬请期待。

对了,你想问我文章里提到的书籍和视频去哪找?我已经给你准备好了

文中提到的资源都可以免费领取,在我的公众号【程序员黄小斜】回复“Java并发编程”即可免费领取对应的资源。

写在最后

如果觉得本文对你有帮助的话,请你也不要吝啬你的“好看”哈,转发朋友圈就是对我最大的支持啦,你们的支持是对我最大的鼓励。

对本系列文章有什么建议和意见,也欢迎留言告诉我,期待你的回馈。