随笔分类 -  并发

摘要:[TOC] 1. 前言 在实际开发中,碰上CPU密集且执行时间非常耗时的任务,通常我们会选择将该任务进行分割,以多线程方式同时执行若干个子任务,等这些子任务都执行完后再将所得的结果进行合并。这正是著名的map reduce思想,不过map reduce通常被用在分布式计算的语境下,这里举这个例子只是 阅读全文
posted @ 2018-09-25 14:19 takumiCX 阅读(1992) 评论(4) 推荐(4) 编辑
摘要:[TOC] 1. 前言 如果你认真看过我前几天写的这篇博客 "自己动手构建无锁的并发容器(栈和队列)" 的队列部分,那么我要向你表示道歉。因为在实现队列的出队方法时我犯了一个低级错误:队列的出队方向是在队列头部,而我的实现是在队列尾部。尽管代码能够正确执行,但明显不符合队列规范。所以那部分代码写作" 阅读全文
posted @ 2018-08-18 14:32 takumiCX 阅读(3594) 评论(0) 推荐(2) 编辑
摘要:[TOC] 1. 前言 在 "自己动手构建无锁的并发容器(栈和队列)" 中我们基于CAS算法构建了自己的无锁队列,其底层实现是不带哨兵结点的双向链表。双向链表为当前结点保留了指向前驱结点的引用,这种特性有时很有用,比如ReentrentLock中线程被唤醒后会通过prev指针找到前驱结点,通过判断其 阅读全文
posted @ 2018-08-15 11:01 takumiCX 阅读(1590) 评论(0) 推荐(0) 编辑
摘要:更新日志(2018年8月18日):这篇博客的队列部分犯了个低级错误:入队和出队在同在队列尾端进行。正确的实现方式见 "基于双向链表实现无锁队列的正确姿势(修正之前博客中的错误)" [TOC] 1.前言 并发容器是线程安全的容器。它在实现容器基本功能的前提下,还提供了并发控制能力,使得容器在被多线程并 阅读全文
posted @ 2018-08-11 09:05 takumiCX 阅读(2273) 评论(2) 推荐(1) 编辑
摘要:[TOC] 1.前言 在 "ReentrantLock(重入锁)功能详解和应用演示" 这篇文章里我们讲解并演示了ReentrantLock(重入锁)的各种功能,其中就谈到ReentrantLock可以有公平锁和非公平锁的不同实现,只要在构造它的时候传入不同的布尔值,继续跟进下源码我们就能发现,关键在 阅读全文
posted @ 2018-08-07 08:51 takumiCX 阅读(26927) 评论(21) 推荐(17) 编辑
摘要:[TOC] 1. ReentrantLock简介 jdk中独占锁的实现除了使用关键字synchronized外,还可以使用ReentrantLock。虽然在性能上ReentrantLock和synchronized没有什么区别,但ReentrantLock相比synchronized而言功能更加丰富 阅读全文
posted @ 2018-07-19 23:11 takumiCX 阅读(101023) 评论(14) 推荐(30) 编辑
摘要:[TOC] 1.LockSupport功能简介 在java并发包下各种同步组件的底层实现中,LockSupport的身影处处可见。JDK中的定义为用来创建锁和其他同步类的线程阻塞原语。 我们可以使用它来阻塞和唤醒线程,功能和wait,notify有些相似,但是LockSupport比起wait,no 阅读全文
posted @ 2018-07-18 12:14 takumiCX 阅读(13397) 评论(3) 推荐(1) 编辑
摘要:[TOC] 1. 从一次项目经历说起 在上家公司做spark的任务调度系统时,碰到过这么一个需求: 1.任务由一个线程执行,同时在执行过程中会创建多个线程执行子任务,子线程在执行子任务时又会创建子线程执行子任务的子任务。整个任务结构就像一棵高度为3的树。 2.每个任务在执行过程中会生成一个任务ID, 阅读全文
posted @ 2018-07-16 22:58 takumiCX 阅读(2341) 评论(1) 推荐(1) 编辑
摘要:[TOC] 1. 从乐观锁和悲观锁谈起 乐观锁和悲观锁是两种不同的解决并发问题的策略。悲观锁策略假定任何一次并发都会发生冲突,所以总是采用最严格的方式来进行并发控制。java中的独占锁(synchronized和重入锁)就是典型悲观锁实现,它只允许线程互斥的访问临界区,也就是阻塞式的同步方式。而乐观 阅读全文
posted @ 2018-07-14 18:58 takumiCX 阅读(3141) 评论(0) 推荐(0) 编辑
摘要:[TOC] 1. 关于synchronized关键字 java中要实现多线程的互斥同步访问,最简单的方式就是使用synchronized关键字。被其修饰的代码,相当于加了独占锁,线程只能互斥的访问,即同一时间只有一个线程能够访问这部分代码,其他线程只能在外等待。那么synchronized是如何做到 阅读全文
posted @ 2018-07-13 21:59 takumiCX 阅读(1187) 评论(0) 推荐(0) 编辑
摘要:[TOC] 1.关于volatile volatile是java语言中的关键字,用来修饰会被多线程访问的共享变量,是JVM提供的轻量级的同步机制,相比同步代码块或者重入锁有更好的性能。它主要有两重语义,一是保证多个线程对共享变量访问的可见性,二防止指令重排序。 2.语义一:内存可见性 2.1 一个例 阅读全文
posted @ 2018-07-12 23:13 takumiCX 阅读(5338) 评论(9) 推荐(2) 编辑