并发编程之学习总结

前言

楼主自1月14号就停更了,这段时间一直在看JVM,因此没有更新任何文章,但楼主觉得有必要总结一下之前学习并发的过程,因为这一次的总结其实就是下一次的开始。主要时总结一下并发的学习路线,因为在楼主的工作环境中,并不是每天都在编写高并发的程序。然而,即使是这样,我们也要知道并发的每个知识点,这样才算一个合格的Java 程序员。那么如何系统的学习并发呢?学习路线是怎么样的呢?

1. 学会开始就成功了一半

首先要确定的思想是:并发编程很复杂,不是看一两篇博客就搞定的。楼主学习学习并发主要看了4本书:

  1. 《并发编程实战》
  2. 《并发编程的艺术》
  3. 《Java 高并发程序设计》
  4. 《深入理解 Java 虚拟机》第五部分:高效并发

也就是上面的几本书。还有一个建议就是,看书最好是看实体的,有什么好处呢?好处就是,当你脑子里有一个疑惑的时候,你能够立马翻书去验证你的想法。而不是打开电子书,慢慢找。不过也有很多人喜欢电子书,毕竟地铁上看书不方便。具体买什么书可以根据自己的情况来。没有最好的,只有最合适的。还有一个问题,就是,看书不一定是从头到尾一字不漏的看,这和死读书差不多。楼主的读书经验是:先快速的将全书过一遍,大概会花一天时间,再找到自己感兴趣的点慢慢看,慢慢配合代码验证。这样效率会高一点。而且理解的会更加深刻。这也算一个学习的方法吧。

那么这四本书先看哪一个呢?楼主是先看的《Java 高并发程序设计》,国人写的。相比较于其余的3本,通俗易懂。注意,看这本书的时候,一定要配合着书敲代码。否则都是白瞎。

2. 逐渐深入

在看完了 《Java 高并发程序设计》 后和写了一些 demo 后,我们应该会基本的并发编程了,知道如何使用 JDK 中的 API,也知道了一些基本的 Java 内存模型,一些关键字的理论。这个时候,我们仅仅是 How 的阶段,也就是使用的阶段。如果你是一个有追求的程序员,你肯定想深入了解并发中哪些奇怪的约定,奇怪的事情到底是如何发生的,那么,就需要继续读书,写代码。

这个时候,就需要看看《并发编程的艺术》和《深入理解 Java 虚拟机》第五部分:高效并发,这两本书,重点深入原理,配合 JVM 源码和 汇编深入解释并发的原理。读起来酣畅淋漓。将之前的哪些困惑一扫而空。至于为什么看两本,因为每本书都不是完美的,那些写书的作者的观点也会不同,因此,我们需要知道的更多,并对比他们的看法,才能更加深入的形成自己的思维模型。不能只跟着一本书走。

这两本书主要是理论,但请注意,其中的理论我们可以用代码来验证,才能更深刻的加深印象。

3. 深入源码

在了解了原理之后,我们只是得到了理论知识,但很虚无,如果你是个好奇猫,那么你肯定想知道这些设计是如何实现的。幸运的是,从 Java 源码中,我们就能知道百分之90 了(剩下的在 HotSpot 源码中)。这个时候我们做什么呢?

硬肛!!!翻起我们之前写的那些 demo,比如 new Thread(),new ConcurrentHashMap(),这些我们之前练习的 demo,配合我们的开发工具(强烈推荐 IDEA),鼠标左键 + ctrl,进入源码查看如何实现。源码重点在 java.util.concurrent 包下。这些都是并发大师 Doug Lea 的杰作。值得反复品味。当然,看源码的时候,也可以顺带结合源码看看之前的书。加深印象。

只有看懂了源码,你才能说,你真正知道了原理。

在看源码的过程中,有痛苦,有快乐,起码楼主是这样的。痛苦的是:很多奇怪的地方看不懂。快乐的是:那些奇怪的地方终于搞懂了。这就是编程的乐趣吧。像一个侦探,慢慢的解开所有的疑惑,最后找到真相。

为什么说硬肛呢?从短期来说,看源码处理满足好奇心,并不能给你带来什么好处。如果看源码不能给你带来快乐,那么,很快,你就会坚持不下去,但是,请注意:这是你进阶高级 Java 程序员的一个标志。

当然,不是所有的源码都是要看的。这时候就体现出 demo 的重要性了,如果你之前没有 demo,那么你将无从下手。但是,如果你听了楼主的:边看书的同时也写了demo,那么这个时候,你就可以顺着demo看源码了,有什么好处呢?好处就是:你从源码层面了解了你使用的api的具体实现。从这个意义上说:你已经学会并发编程了。

也许,经过一到两个月的阅读源码的过程,你对 JUC (java.util.concurrent)包下的 API 已经了如执掌,恭喜你,你终于学会了并发编程。不读源码,不足以谈并发。

总结

通过上面的3个步骤,基本就能搞定 Java 并发编程,看这篇文章的你,可以算一下时间,楼主估算了一下,如果你是在职的,那么你需要在工作之余完成这件事情,大概需要2个多月,当然这也要看你的 Java 基础好不好了,这和平时的积累有很多关系。如果你是个天才,当楼主没说。但大部分人都是凡人,都是靠着坚持和努力才能达到自己的目标。所以,请努力吧!

最后,当你看完了 JUC 的源码,感觉还不过瘾,HotSpot 的源码等着你,够你喝好久。因为楼主正在喝 HotSpot 的源码。哈哈哈哈。

原文地址:https://www.cnblogs.com/stateis0/p/9062098.html

时间: 2024-10-06 07:43:40

并发编程之学习总结的相关文章

【java并发编程艺术学习】(三)第二章 java并发机制的底层实现原理 学习记录(一) volatile

章节介绍 这一章节主要学习java并发机制的底层实现原理.主要学习volatile.synchronized和原子操作的实现原理.Java中的大部分容器和框架都依赖于此. Java代码 ==经过编译==>Java字节码 ==通过类加载器==>JVM(jvm执行字节码)==转化为汇编指令==>CPU上执行. Java中使用的并发机制依赖于JVM的实现和CPU的指令. volatile初探 volatile是是轻量级的synchronized,它在多处理器开发中保证了共享变量的可见性.可见性

java并发编程实战学习(3)--基础构建模块

转自:java并发编程实战 5.3阻塞队列和生产者-消费者模式 BlockingQueue阻塞队列提供可阻塞的put和take方法,以及支持定时的offer和poll方法.如果队列已经满了,那么put方法将阻塞直到空间可用:如果队列为空,那么take方法将阻塞直到有元素可用.队列可以是有界的也可以是无界的. 如果生产者生成工作的速率比消费者处理工作的速率款,那么工作项会在队列中累计起来,最终好紧内存.同样,put方法的阻塞特性也极大地简化了生产者的编码.如果使用有界队列,当队列充满时,生产者将阻

《Java虚拟机并发编程》学习笔记

对<Java虚拟机并发编程>这本书真的是相见恨晚.以前对并发编程只是懂个皮毛,这本书让我对并发编程有了一个全新的认识.所以把书上的知识点做下笔记,以便以后复习使用. 并发与并行 仔细说来,并发和并行是两个不同的概念.但随着多核处理器的普及,并发程序的不同的线程往往会被编译器分配到不同处理器核心上,所以说并发编程与并行对于上层程序员来说是一样的. 并发的风险 饥饿 当一个线程等待某个需要运行时间很长或者永远无法完成的时间发发生,那么这个线程就会陷入饥饿状态.通常饥饿也会被叫做活锁. 解决饥饿的方

Java并发编程深入学习

基本概念 在实践中,为了更好的利用资源提高系统整体的吞吐量,会选择并发编程.但由于上下文切换和死锁等问题,并发编程不一定能提高性能,因此如何合理的进行并发编程时本文的重点,接下来介绍关于锁最基本的一些知识(选学). volatile:轻量,保证共享变量的可见性,使得多个线程对共享变量的变更都能及时获取到.其包括两个子过程,将当前处理器缓存行的数据写回到系统内存,之后会使其他CPU里缓存了该内存地址的数据无效. synchronized:相对重量,其包含3种形式,针对普通同步方法,锁是当前实例对象

Java并发编程深入学习——Lock锁

Lock锁介绍 ??在Java 5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile.Java 5.0 增加了一种新的机制:ReentrantLock.它并不是一种替代内置加锁的方法,而是当内置加锁机制不适用时,作为一种可选择的高级功能. Lock接口 Lock接口位于java.util.concurrent.locks包中,它定义了一组抽象的加锁操作. public interface Lock { //获取锁 void lock(); // 如果当

Python并发编程之学习异步IO框架:asyncio 中篇(十)

大家好,并发编程 进入第十章.好了,今天的内容其实还挺多的,我准备了三天,到今天才整理完毕.希望大家看完,有所收获的,能给小明一个赞.这就是对小明最大的鼓励了.为了更好地衔接这一节,我们先来回顾一下上一节的内容. 上一节「」,我们首先介绍了,如何创建一个协程对象.主要有两种方法 通过async关键字, 通过@asyncio.coroutine 装饰函数. 然后有了协程对象,就需要一个事件循环容器来运行我们的协程.其主要的步骤有如下几点: 将协程对象转为task任务对象 定义一个事件循环对象容器用

java并发编程实战学习笔记之第三部分:活跃性、性能与测试

第十章 避免活跃性危险 锁顺序死锁:定义锁的顺序,可以通过某种方法决定每个锁的顺序,比如hashcode或者序列号之类的 在锁的调用顺序不是很明显的情况下,在持有锁的情况下调用其他外部方法一定要注意,可以通过开放调用,避免发生死锁的危险,即使用同步代码块保护仅仅保护那些共享变量即可,但这种降低锁粒度的方法可能会使得原本大的代码块失去原子性,解决办法为:将服务的状态改为关闭之前一直持有锁,状态改变之后,其他线程也就能够看到关闭信息从而不会再次执行关闭操作... 死锁的诊断与避免:    通过try

java并发编程实战学习笔记之对象的组合与基础构建模块

第四章 对象的组合 4.1 构建安全的类 4.2 实例封闭 @ThreadSafe public class PersonSet {     @GuardedBy("this") private final Set<Person> mySet = new HashSet<Person>();     public synchronized void addPerson(Person p) {         mySet.add(p);     }     pub

java并发编程实战学习笔记之取消与关闭

第七章 取消与关闭 7.1 任务取消 方式一.通过volatile类型的域来保存取消状态 方式二.interrupt()方法 interrupt()可以中断目标线程 isinterrupted()方法用来检测目标线程的中断状态 interrupted()用于清除中断状态,并且返回之前的中断状态,这是唯一可以清除中断状态的方法,如果在调用该方法是返回了true,那么除非你想屏蔽这个中断,否则你必须对他进行处理,可以抛出interruptExeption异常或者重新通过interrupt来恢复中断状