并发编程到目前为止一共发了7篇文章了,下面就并发的内容简单的来做一个阶段性的小结。
在开始,我们通过一个很简单的例子(单线程的),讲了Java运行时内存,这部分内容很重要,对于以后理解并发有很大的帮助。然后我们又举了一个Java多线程的例子,讲了Java多线程的运行时内存。这部分内容是属于基础内容。
前面的基础内容讲完后,我们正式进入JUC并发编程。一开始我们讲了什么是JUC并发编程,讲了并发编程关注的两个问题:如何使用线程和如何保证线程安全。后面我们讲了进程、线程、协程三个概念,讲了并发、并行、串行三个概念,后面又讲了CPU的一些内容,至此,准备工作讲完。
上面的准备内容讲完后,我们开始了第一大点:如何使用线程。我们讲了怎么创建线程,即创建线程的三种方式,这个要牢牢掌握。然后,我们简单的讲了一下线程的底层原理(源码层级的),画了一张图,这部分内容最后是掌握一下,面试时说出来很装逼的。后来我们讲了线程中的一些方法,很多,要掌握常用的几个。线程讲完后,我们讲了线程池,讲了怎么使用线程池,使用线程池的注意事项,线程池的底层原理是什么(那几个参数),以及如何自定义线程池。这部分很重要,面试必问。至此,我们并发编程第一大点:如何使用线程讲完了。
下面看并发编程的第二大点:如何保证线程安全。在讲具体内容之前,我们讲了JMMJava内存模型(最好说成Java多线程内存模型,和JVM的那个区别开来),讲了volatile关键字和它的底层原理,具体的讲解了有序性。之后,我们正式开始讲Java的线程安全,讲了什么是线程安全,线程安全的三大特性,如何保证线程安全,我们讲了破坏临界资源、使用ThreadLocal、使用volatile关键字、使用原子类等方式,每种方式都要掌握。后面,我们重点的讲解了并发编程中的锁,用锁来保证线程安全,我们讲了乐观锁与悲观锁,在乐观锁中我们讲了CAS算法、ABA问题,然后我们讲了自旋锁与互斥锁,讲了消费者与生产者模式(这部分内容属于拓宽的),然后中的讲了 synchronized锁升级机制,讲了可重入锁,讲了ReentrantLock同步互斥锁,讲了公平锁和非公平锁,讲了共享锁和排他锁,讲了synchronized与Lock的区别。至此,我们线程安全的内容算是讲完了。
看到这里,是不是感觉并发编程的内容很多?的确,并发编程的内容非常多,非常的散,非常的碎,并且它的许多内容是与计算机的底层联系的一起的,如果想真正的理解,必须要从计算机的底层说起,所以这部分内容也非常的不好理解。
但是,那又怎样呢?因为难就不学吗?Of Course Not !我们要有 “ 明知山有虎,偏向虎山行 ” 的勇气,要有 “ 不到长城非好汉,屈指行程二万 ” 的豪迈,要有 “ 长风破浪会有时,直挂云帆济沧海 ” 的信心。正如肯尼迪在演讲中所说的“ We choose to go to the moon. We choose to go to the moon in this decade and do the other things, not because they are easy, but because they are hard, because that goal will serve to organize and measure the best of our energies and skills, because that challenge is one that we are willing to accept, one we are unwilling to postpone, and one which we intend to win, and the others, too.”一样。愿诸君都能永远向上!
并发编程系列文章中有些内容讲的不是很清楚很详细,后面有机会了我会再针对那些内容出单篇的文章去详细的讲解。