要说多线程,先来说说多线程的优点,那些不可不说的美妙的故事:
(1)进程间不能共享内存,但线程之间可以共享内存非常容易;
(2)系统创建进程需要为该进程重新分配系统资源,但创建线程则代价小的多,因此使用多线程来实现多任务并发比多进程的效率高;
(3)Java语言内置多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了Java的多线程编程。

Java初学

再来说说多线程的那些坑,真是坑死人不偿命的那种,使用起来特别爽,出现的问题往往让人摸不着头脑,可真所谓相爱相杀。多线程环境下的一些问题:安全性问题,在没有正确同步的情况下,多线程环境下程序可能得出错误的结果;活跃性问题,在多线程环境下,当某个操作应该继续执行却无法继续执行下去,就造成了活跃性问题,如:死锁,饥饿,活锁;性能问题,线程的频繁切换将带来极大的开销,如:保存和恢复执行上下文,丢失局部性。使用同步机制的时候,这些机制会抑制某些编译器优化以保证执行顺序,如使用volatile保证可见性的情况下,使内存缓冲区中的数据无效,其他线程需要重新从主内存中加载。所有这些因素会带来额外的性能开销。

Java初学

再来说说学习的步骤,个人也打算按照这一步骤来走,具体没有实践过,且行且珍惜。关注大师的言行,跟随大师的举动——JUC包已经足够丰富,按照API规范正确使用。和大师一起修行——理解多线程问题的由来,以及JVM给出的解决方案,需要理解java的内存模型JMM,以及JMM给出的线程工作内存与主内存交互的规则如何形成JMM的happens-before原则等。参考书有知名的《深入理解Java虚拟机》第12章,最重要的《JSR-133 Java内存模型与线程规范》以及《并发编程实战》第16章。领悟大师的意境——JUC包的实现原理,volatile和CAS构筑了JUC包的基础类,AQS,非阻塞数据结构,原子变量,这些基础类又构建了JUC包的高层类,Lock,同步器,阻塞队列,并发容器,Executor等。理解了高层类的原理,能够心里有底地使用这些类,构建健壮的应用。成为真正的大师——学习JUC包的实现,说不定哪天也能写出一样优秀的类。

Java初学

梦想还是要有的呢,万一实现了呢?虽然实现的可能性不大,但是作为一只有理想的猿,还是要有点儿追求,而这点儿追求,多线程或许就是必须迈过的坎。
Java初学