Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容。
这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类。当然这些都是并发编程的基本知识,除了使用这些工具以外,Java并发编程中涉及到的技术原理十分丰富。为了更好地把并发知识形成一个体系,也鉴于本人目前也没有能力写出这类文章,于是参考几位并发编程方面专家的博客和书籍,做一个简单的整理。
首先说一下我学习Java并发编程的一些方法吧。大概分为这几步:
1、先学会最基础的Java多线程编程,Thread类的使用,线程通信的一些方法等等。这部分内容需要多写一些demo去实践。
2、接下来可以去使用一些JUC的API,比如concurrenthashmap,并发工具类,原子数据类型等工具,在学习这部分内容的时候,你可以搭配一些介绍并发编程的书籍和博客一起看,书籍我当时看的是《Java并发编程艺术》,我觉得略好于《Java并发编程实践》。
我这个专栏里也整合了一些比较好的博客,所以大家可以不妨先看看。
3、接下来就要阅读源码了,读源码部分最主要的就是读JUC包的源码,比如concurrenthashmap,阻塞队列,线程池等等,当然,这些源码自己读起来会比较痛苦,所以建议跟着博客走。
4、走到这一步,你已经理解了Java并发编程原理,并且可以熟练使用JUC,应付面试已经足够了,剩下的事情就是真正把这些东西用到项目中去,我当时在网易实习的时候就用到了JUC的一些内容,不得不说还是挺有意思的。
下面先介绍一下Java并发编程的一些主要内容,我把它分六个部分,大家可以参考这几个部分的内容分别进行学习。
一:并发基础和多线程
首先需要学习的就是并发的基础知识,什么是并发,为什么要并发,多线程的概念,线程安全的概念等。
然后学会使用Java中的Thread或是其他线程实现方法,了解线程的状态转换,线程的方法,线程的通信方式等。
二:JMM内存模型
任何语言最终都是运行在处理器上,JVM虚拟机为了给开发者一个一致的编程内存模型,需要制定一套规则,这套规则可以在不同架构的机器上有不同实现,并且向上为程序员提供统一的JMM内存模型。
所以了解JMM内存模型也是了解Java并发原理的一个重点,其中了解指令重排,内存屏障,以及可见性原理尤为重要。
JMM只保证happens-before和as-if-serial规则,所以在多线程并发时,可能出现原子性,可见性以及有序性这三大问题。
下面的内容则会讲述Java是如何解决这三大问题的。
三:synchronized,volatile,final等关键字
对于并发的三大问题,volatile可以保证可见性,synchronized三种特性都可以保证。
synchronized是基于操作系统的mutexlock指令实现的,volatile和final则是根据JMM实现其内存语义。
此处还要了解CAS操作,它不仅提供了类似volatile的内存语义,并且保证操作原子性,因为它是由硬件实现的。
JUC中的Lock底层就是使用volatile加上CAS的方式实现的。synchronized也会尝试用cas操作来优化器重量级锁。
了解这些关键字是很有必要的。
四:JUC包
在了解完上述内容以后,就可以看看JUC的内容了。
JUC提供了包括Lock,原子操作类,线程池,同步容器,工具类等内容。
这些类的基础都是AQS,所以了解AQS的原理是很重要的。
除此之外,还可以了解一下Fork/Join,以及JUC的常用场景,比如生产者消费者,阻塞队列,以及读写容器等。
五:实践
上述这些内容,除了JMM部分的内容比较不好实现之外,像是多线程基本使用,JUC的使用都可以在代码实践中更好地理解其原理。多尝试一些场景,或者在网上找一些比较经典的并发场景,或者参考别人的例子,在实践中加深理解,还是很有必要的。
六:补充
由于很多Java新手可能对并发编程没什么概念,在这里放一张不错的思维导图,该图简要地提几个并发编程中比要重要的点,也是比较基本的点,在大致了解了这些基础内容以后,才能更好地开展后面详细内容的学习。
上面讲到了学习路线,建议大家先跟着这个路线去看一看本专栏的一些博客,然后再来看下面这部分内容,因为下面的内容是我基于本专栏所有博客进行归纳和总结的,主要是方便记忆和复习,也可以让你把知识点重新过一遍,如果你觉得我的总结不够好,你也可以自己做总结,这也是一种不错的学习方法,话不多少,咱们接着往下看。
这篇总结主要是基于我Java并发技术系列的文章而形成的的。主要是把重要的知识点用自己的话说了一遍,可能会有一些错误,还望见谅和指点。谢谢
更多详细内容可以查看我的专栏文章:Java并发技术指南