并发编程
zh328271057
java菜鸟
展开
-
并发编程学习(1)-----线程安全性
思维导图:引言: 并发编程学习系列是我对《Java 并发编程实战》这本书的学习总结。 所谓的线程安全性就是指在多个线程访问某个类时,这个类都能表现出正确的行为,那么称这个类是线程安全的。本文主要分两个部分来介绍线程安全性:原理部分:主要介绍原子性和原子操作 使用部分:主要介绍如何用锁来保证线程安全性及并发性能的提高一.原子性 此小节会通过类的状态(域对...原创 2019-07-16 22:21:41 · 298 阅读 · 0 评论 -
并发编程学习(2)-----对象的共享
思维导图:引言: 本文主要介绍类的域变量被多个线程共享时所导致的可见性问题。我所理解的可见性是指类的域变量在某一线程中变化时能够及时准确的被其他线程所看见。文章还是分成两个部分进行描述:理论部分:包括如何判断域变量是否可见,会导致什么样的问题,又该如何解决。 使用部分:通过 不发布对象>>发布但不可修改>>安全发布对象的次序逐渐深入的探讨如何构建一个...原创 2019-07-18 21:52:37 · 101 阅读 · 0 评论 -
并发编程学习(3)-----对象的组合
思维导图:引言: 在前两篇文章中,我们介绍了如何判断一个类是否是线程安全的,也介绍了如何判断一个变量是否可以被其他线程使用,即可见性。以上两篇文章是构造线程安全类的基础。在此基础之上,我们将这在这篇文章中,初步地介绍如何从无到有或者利用已有的线程安全类的资源构造我们自己的线程安全的类。按照惯例,文章大体分成两部分:理论部分:我称之为同步要素分析,即分析当前组合类所拥有的的对象...原创 2019-07-23 07:36:39 · 238 阅读 · 0 评论 -
并发编程学习(4)-----基础构建模块
思维导图:引言: 这篇文章的主要内容是简要的介绍Java类库中可用的并发构建模块。它同前三篇文章一起构成了多线程技术的基础理论部分。这篇文章只有一个部分,即基础构建模块的体系部分:体系部分:主要内容是Java类库中当前可以使用的线程安全类的体系,比如并发容器,同步容器,同步工具等内容。一.同步容器类 同步容器类实现的方式是将其内部的状态封装起来,并对每个公有方法都...原创 2019-07-30 07:57:32 · 192 阅读 · 0 评论 -
并发编程学习(5)-----第一部分-基础知识的总结
思维导图:引言: 本文的作用就是归纳以前四篇文章的作用以及他们之间的联系。总结: 第一篇的内容是线程安全性,这是整个基础部分知识提纲挈领性的纲要。这篇文章中,通过对原子性的分析,我们分别介绍了类在无状态,有唯一状态和多个状态时应该如何保证线程安全性。 特别注意,当类有一个状态时,就有可能发生竞态条件的异常了。但是,在什么样的情况下会发生静态条件在本篇...原创 2019-07-31 08:09:14 · 116 阅读 · 0 评论 -
并发编程学习(6)-----任务执行
思维导图:引言: 本章的核心内容是描述如何使用多线程来执行任务,会遇到什么问题,又该如何解决。按照惯例,本章内容分为两个部分理论部分:介绍了如何使用多线程,以及如何管理多线程 使用部分:以网页渲染为例使用多线程,并分析任务的并行性处理一.在线程中执行任务 本节分为两部分,即使用单线程执行任务和使用多线程执行任务。1.1 串行执行任务 执行任务最简单...原创 2019-08-02 08:33:44 · 212 阅读 · 0 评论 -
并发编程学习(7)-----任务的取消和关闭
思维导图:引言: 本文的主要内容是给出各种实现取消和中断的机制,以及如何编写任务和服务,使得他们能对取消请求作出响应。相应的,本文大体上分为理论部分和使用部分。理论部分:介绍任务的中断机制及处理手段。 使用部分:介绍如何编写处理单个任务的中断和服务中断以及JVM关闭的的方法。一.中断 本节的主要内容是介绍Java中断的机制。 我们把将还未执行完成的任务...原创 2019-08-21 22:11:53 · 299 阅读 · 0 评论 -
并发编程学习(8)-----线程池的使用
思维导图:引言: 本章主要介绍如何选择,配置和扩展线程池。所以,本文的所有部分都归属于使用部分。使用部分:介绍如何选择合适的线程池,配置合适的线程池参数,并扩展线程池的功能一.选择线程池 在前文中提到过,Executors可以产生不同类型的线程池,每种线程池的特性和功能不同。当我们需要执行一个或者多个任务的时候,需要选择恰当的线程池提交并执行任务,如果选择了不恰当...原创 2019-08-31 22:23:16 · 177 阅读 · 0 评论 -
并发编程学习(9)-----第二部分-结构化并发应用程序
思维导图:引言: 本文的主要内容是对第六,七,八篇文章进行总结。总结: 《任务执行》的主要内容其实就是说执行一个多线程任务最好的方式就是使用线程池。在此基础之上,介绍了4中线程池的性质和其生命周期的管理。 《任务的取消》的主要内容则是介绍如何取消一个正在执行的任务。其本质就是说最好利用JAVA本身携带的协作中断机制。对于单个任务来说使用Futrue是...原创 2019-09-02 07:23:10 · 148 阅读 · 0 评论 -
并发编程学习(10)-----避免活跃性危险
思维导图:引言: 本文的主要内容是介绍一些导致程序发生活跃性故障的原因,以及如何避免他们的方法。理论部分:介绍死锁,活锁,饥饿这些活跃性故障发生的原因及避免方法。一.死锁 有个经典的哲学家问题,有五个哲学家,每两个哲学家之间有一根筷子,当哲学家拥有两根筷子时就可以吃饭。这其中就有发生死锁的情况,即每个哲学家都占有一根筷子并等待其他人放下筷子,结果就是所有的哲学家都...原创 2019-09-04 08:04:03 · 123 阅读 · 0 评论 -
并发编程学习(11)-----性能
思维导图:引言: 使用多线程最主要的目的就是提升程序的运行性能,本章的主要内容就是介绍如何分析多线程程序的性能以及如何提高性能。全文大体分为以下两个部分:理论部分:性能分析,包括如何分析多线程程序的执行性和可伸缩性 使用部分:性能提升,包括使用锁分段,减小锁粒度,减小锁范围等一系列手段以提升程序的性能。一.性能分析 这个小节会对两部分性能进行分析。执行性:指...原创 2019-09-06 21:42:52 · 157 阅读 · 0 评论 -
并发编程学习(12)-----并发性能的测试
思维导图:引言: 本文的主要内容是介绍如何测试并发程序。因为全是都只是对并发程序的测试的简要描述,所以基本上都归属于理论部分。理论部分:包括正确性测试,性能测试,和其他测试一.正确性测试 对于并发程序来说,我们应该首先保证其正确性,即能够正确运行并获得正确的结果。那么,如何保证并发程序的正确性呢?我们可以从需要检查的不变性条件和后验条件入手,并从以下几个方面进行分...原创 2019-09-16 07:59:07 · 554 阅读 · 0 评论 -
并发编程学习(13)-----第三部分-活跃性,性能和测试
引言: 本文主要是对10,11,12篇文章进行总结。总结: 《避免活跃性危险》的主要内容是介绍如何可能出现的活性性危险有什么。比如死锁,活锁,饥饿。遇到不同的活跃性危险又该如何避免。例如,死锁可能出现的情况有顺序死锁,动态顺序死锁,多对象调用,资源死锁等情况,根据不同的情况,我们可以采用固定加锁顺序,开放调用,合理利用资源等手段避免死锁的发生。 《性能》的主要内容...原创 2019-09-17 07:35:46 · 157 阅读 · 0 评论 -
并发编程学习(14)-----显式锁
思维导图:引言: 本文的主要内容是介绍两种显式锁的使用。一种是Lock,一种是ReadWriteLock。所以,本文可以归类为使用部分:使用部分:介绍Lock,其实现类是ReentrantLock,功能则是补充synchronized的不足。也会介绍ReadWriteLock,用于读多写少的并发程序。一.Lock 显式锁Lock可以作为synchronized在功...原创 2019-09-23 07:21:37 · 151 阅读 · 0 评论 -
并发编程学习(15)-----自定义同步工具
思维导图:引言: 当原生的同步工具类,比如CountDownLauch,Semaphore,ReentrantLock等不能提供我们所需要的功能时,我们就需要自定义一个新的同步工具类了。 本文将会先介绍如何对状态依赖性进行管理,然后介绍自定义同步类的工具体系。原理部分:如何对具有状态依赖性的同步工具进行管理 体系部分:介绍java提供的底层的同步体系一.状态依赖...原创 2019-09-27 08:30:05 · 194 阅读 · 0 评论 -
并发编程学习(16)-----非阻塞同步机制
思维导图:引言: 在此之前,所有对并发竞争的处理都是使用锁来处理的。使用锁固然可以保证修改的正确性,但是,所也有它固有的缺点。锁的缺点如下:高开销:使用锁必然意味着在多个线程竞争时大部分线程都会陷入沉睡然后唤醒的循环,会有极大的开销。 长等待:等待中的线程是什么也不能做的,只能等待,这是一种资源的浪费。 优先级反转:当低优先级的线程获取到锁后,如果此时高优先级的线程也需要...原创 2019-10-04 16:44:32 · 184 阅读 · 0 评论 -
并发编程学习(17)-----Java内存模型
思维导图:引言: 在前面的文章中,我们刻意的避免了对java内存模型JMM的介绍。实际上,正是java内存模型决定了对java代码的重排序。重排序实际就是多个线程对变量改动的不可见的原因,因为在代码逻辑上A线程成的操作在B线程的操作之前进行,但是进过JVM进行重排序后,可能B线程的操作就会在A线程之前进行。通过了解java内存模型,我们可以知道,满足什么样的条件,JVM就不会进行...原创 2019-10-06 19:20:38 · 169 阅读 · 0 评论 -
并发编程学习(18)-----第四部分-高级主题
引言: 本文主要是对14,15,16,17篇文章进行总结。总结: 高级主题这个部分各个章节的关联性不打,所以没能画出具有逻辑关系的思维导图来,接下来我们对着个部分的四个章节进行概要的简单回顾。 《显式锁》这章介绍了除synchronized之外的加锁方式,即显式锁。但是显式锁在java中的定位不是用于替代synchronized,而是作为其功能的补充。显示锁Loc...原创 2019-10-06 20:14:35 · 166 阅读 · 0 评论