并发编程的艺术
wangjimmy1994
这个作者很懒,什么都没留下…
展开
-
并发编程的艺术之读书笔记(十六)
前言: 上一部分我们学习了java的线程池,这一部分,我们来学习java的Executor框架 1. Executor框架简介 java多线程程序通常把应用分解成若干个任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程。Executor框架的结构如下 任务。包括任务需要实现的接口:Runnable接口或Callable接口 任务的执行,包括任务执行机制的核...原创 2020-04-04 21:21:58 · 262 阅读 · 0 评论 -
并发编程的艺术之读书笔记(十五)
前言: 上一部分,我们简单的学习了java的并发工具类,这部分我们开始学习java的线程池 1. 什么是线程池 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。这避免了在处理短时间任务时创建与销毁线程的代价。java中的线程池是运用场景最多的并发框架,几乎所有需要异步或者并发执行任务的程序都可以使用线程池,在开发过程中,合理使用线程池可以带来3个好处...原创 2020-04-04 17:41:51 · 251 阅读 · 0 评论 -
并发编程的艺术之读书笔记(十四)
前言: 上一部分我们一起学习了java中的原子类,这一部分,我们来学习java中的并发工具类 1. CountDownLatch CountDownLatch是一个同步工具类,它允许一个或多个线程等待其他线程各自执行完毕后再执行。CountDownLatch通过计数器来实现,CountDownLatch的构造函数接收一个int类型的参数作为计数器,计数器的初始值是线程的数量。每当一个线程执行...原创 2020-04-04 14:38:58 · 851 阅读 · 0 评论 -
并发编程的艺术之读书笔记(十三)
前言: 上一部分,我们一起学习了java中的Fork/Join框架,这一部分,我们来一起学习java中的原子类 我们知道当多个线程同时更新一个变量,可能会导致更新不同步的问题,比如变量i=1,有两个线程A和B,A操作i=i+1,B操作i=i+1,预期得到i=3,结果i却等于2,那是因为A和B线程在更新i时拿到的i都是1,这就是多线程导致的不同步问题,为了解决这个问题,我们一般会使用synchr...原创 2020-04-03 13:22:34 · 282 阅读 · 0 评论 -
并发编程的艺术之读书笔记(十二)
前言: 上一部分,我们一起学习了java中的阻塞队列,这一部分,我们来学习Fork/Join框架 1. 什么是Fork/Join框架 java从1.7开始提供一个用于并行执行任务的框架,是一个把大任务分成若干个小任务,最后汇总小任务的结果得到大任务结果的框架。 我们通过Fork和Join这两个单词来简单理解一下Fork/Join框架。Fork就是把一个大任务切分为若干个任务并行的执行,Jo...原创 2020-04-02 23:01:21 · 239 阅读 · 0 评论 -
并发编程的艺术之读书笔记(十一)
前言: 上一部分,我们一起学习了ConcurrentHashMap的概念,部分实现原理及使用,这一部分,我们来学习java中的阻塞队列原创 2020-04-02 21:13:34 · 890 阅读 · 0 评论 -
并发编程的艺术之读书笔记(十)
前言: 上一部分我们一起学习了Condition接口,这一部分我们一起来学习并发包中的ConcurrentHashMap。 1. ConcurrentHashMap的实现原理及使用 首先我们要知道什么是ConcurrentHashMap,ConcurrentHashMap是一个保证线程安全的高效的HashMap,那么我们为什么要使用ConcurrentHashMap呢,那是因为在并发编程中使...原创 2020-04-02 15:37:48 · 956 阅读 · 0 评论 -
并发编程的艺术之读书笔记(九)
前言: 上一部分,我们一起学习了可重入锁和读写锁,这部分我们来一起学习Condition接口 1.原创 2020-04-01 23:26:15 · 226 阅读 · 0 评论 -
并发编程的艺术之读书笔记(八)
前言: 上一部分,我们学习了同步器的概念及用法,分析了相关源码,这一部分,我们来一起学习可重入锁和读写锁 1. 可重入锁 可重入锁的意思是同一个线程获得锁之后可以再后续执行过程中再次获得锁而不会造成死锁或阻塞,java中synchronized和ReentrantLock都是可重入锁,这里我们来讨论Lock接口下的ReentrantLock。 ReentrantLock重入锁使用lock(...原创 2020-04-01 13:59:22 · 850 阅读 · 0 评论 -
并发编程的艺术之读书笔记(七)
前言: 上一部分,我们一起学习了线程的基本概念,线程的状态,线程之间的通信,这一部分,我们来一起学习java中的锁原创 2020-03-31 13:21:50 · 326 阅读 · 0 评论 -
并发编程的艺术之读书笔记(六)
前言: 上一部分,我们一起学习了双重检查锁定和延迟初始化的内容,这一部分,我们来学习多线程并发编程的基础内容 1. 线程简介 1.1 什么是线程 操作系统在运行一个程序时,会创建一个进程,比如打开一个qq,那就是启动了一个qq的进程。而线程也叫做轻量级进程,是操作系统中的最小调度单元,在一个进程里可以创建多个线程,每个线程都有自己的计数器,堆栈和局部变量,而且可以访问内存中的共享变量。 ...原创 2020-03-29 20:15:08 · 223 阅读 · 0 评论 -
并发编程的艺术之读书笔记(五)
前言: 上一部分,我们一起学习了锁的内存语义和final域的内存语义,这一部分我们一起来学习双重检查锁定和延迟初始化。 1. 双重检查锁的由来 java程序中,有时需要推迟一些高开销的初始化操作,把初始化推迟到使用这些对象的时候才进行,这种时候就要用到延迟初始化。但是延迟初始化如果不使用一些技巧的话很容易产生问题。比如在多线程环境中的延迟初始化,下面举一个非线程安全的延迟初始化对象的例子 ...原创 2020-03-28 17:55:25 · 876 阅读 · 0 评论 -
并发编程的艺术之读书笔记(四)
前言: 上一部分我们学习了顺序一致性内存模型和volatile的内存语义,这一部分开始我们来学习锁的内存语义和final域的内存语义 1. 锁的内存语义 1.1锁的释放-获取 happens-before 锁是java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一锁的线程发送消息。 下面还是来看代码 public class MonitorTes...原创 2020-03-28 14:37:27 · 276 阅读 · 0 评论 -
并发编程的艺术之读书笔记(三)
前言: 在上一部分我们学习了java内存模型的基础还有指令重排序问题,接下来我们开始探索顺序一致性和volatile语义 1.数据一致性 1.1 数据竞争与顺序一致性 当程序未正确同步时,就可能会存在数据竞争,java内存模型规范对数据竞争的定义如下。 在一个线程中写一个变量,在另一个线程中读同一个变量,而且写和读没有通过同步来排序。 JMM对正确同步的多线程程序的内存一致性做了如下保...原创 2020-03-27 15:41:50 · 898 阅读 · 0 评论 -
并发编程的艺术之读书笔记(二)
前言: 第一部分我们学习了并发编程的挑战和java并发机制的底层实现原理如volitale,synchronized和原子操作的原理,这一部分我们一起来探究java的内存模型 java内存间的通信对程序员透明,同时内存可见性的问题又困扰着程序员,这一部分就来揭开java内存模型的神秘面纱 1.java内存模型的基础 1.1 并发编程的两个关键问题 并发编程中,需要搞清两个重要问题,就是线...原创 2020-03-26 21:24:41 · 197 阅读 · 0 评论 -
并发编程的艺术之读书笔记(一)
前言: 本系列是我阅读并发编程的艺术这本书的笔记,本篇内容是系列的第一篇。 1. 并发编程的挑战 首先我们知道,并发编程的目的是为了让程序运行得更快,但是也并不是启动更多的线程就一定能让程序最大限度的并发执行。在多线程编程中为了使程序运行得更快会遇到非常非常多的挑战,例如死锁的问题,硬件软件资源的限制的问题,上下文切换问题等等。 一起来了解一下什么是上下文切换: CPU通过给每个线程分配...原创 2020-03-25 16:20:29 · 319 阅读 · 0 评论