并发编程
kobejayandy
十多年互联网产品研发经验,历经华为、腾讯、字节跳动等公司,主要从事后端技术研发及技术管理工作(andyjaykobe)
展开
-
Java Memory Model基础
Java 内存模型 ( Java Memory Model )根据Java Language Specification中的说明, JVM系统中存在一个主内存(Main Memory或Java Heap Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对转载 2013-08-04 22:50:43 · 1081 阅读 · 0 评论 -
Java线程安全杂谈——锁、状态依赖与协同以及锁优化
从谈Java并发开始synchronized和锁就时常被谈到,上篇讲Java内存模型特点的时候,也说道用synchronized几乎可以同时满足原子性、可见性和有序性三点,那本篇就来说一下锁的概念、synchronized和API层面Lock锁框架的比较选择。后面也会讲到状态依赖与协同问题、条件队列和锁优化。0. 先说说synchronized。synchronized关键字可谓是并发里的转载 2014-01-04 23:12:46 · 2598 阅读 · 0 评论 -
Lock、ReentrantLock和AbstractQueuedSynchronizer的源码要点分析整理
前面已经说了很多Java并发和线程安全的东西,也提到并对比了内在锁和J.U.C包(java.util.concurrent包,后同)中Lock的锁。从这篇开始,对Java并发的整理从理论进入“实践”阶段,本篇对Lock、ReentrantLock和AbstractQueuedSynchronizer源码做简要分析和整理。先从Lock这个interface说起,然后分析ReentrantLock和A转载 2014-01-05 22:32:43 · 1640 阅读 · 0 评论 -
Callable、Future和CompletionService
在整理执行器Executor之前,需要提到这样几个类/接口,这些类在使用执行器实现并发开发的时候是比较有用的,他们就是Callable、Future和CompletionService。0. Callable在最开始整理Java多线程并发的文章时就提到过了,Runnable是在JDK1.0中就有的。我们再来回头看下java.lang.Runnable:public inte转载 2014-01-05 23:00:01 · 1507 阅读 · 0 评论 -
Java并发编程总结
多线程并发环境下,本质上要解决地是这两个问题:线程之间如何通信线程之间如何同步 在Windows操作系统中Java线程和内核线程一对一影射(_beginthread)在Linux操作系统中Java下使用pthread实现。Phtread在linux下有两种实现,linux 2.6内核缺省使用NPTL。也是一对一影射。Executors•这是一种任务分解。任务提供者和执行者•在本线转载 2014-01-08 23:16:00 · 1951 阅读 · 0 评论 -
AbstractQueuedSynchronizer在工具类ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier中的应用
在java.util.concurrent包中,AbstractQueuedSynchronizer的应用非常广泛,而不局限于在ReentrantLock中的实现,本文简要介绍下AbstractQueuedSynchronizer在Semaphore、CountDownLatch、ReentrantReadWriteLock等类中的应用。0. 回顾上文在介绍AQS的时候,介绍了AQ转载 2014-01-05 22:24:55 · 1643 阅读 · 0 评论 -
Executor/ExecutorService和ExecutorCompletionService
上篇文章讲到了Callable和Futre,这篇文章接着来说说执行器相关的接口和类。在JavaSE5之后,在API的java.util.concurrent包中给出了Executor这样一个接口。因为在Java7之前,JDK中这个接口最终都是以一个线程池ThreadPool的方式实现的,所以很多人也直接叫“线程池”。除了ThreadPool之外,还有ForkJoinPool实现,本文中,我们不妨直转载 2014-01-05 23:05:07 · 3708 阅读 · 0 评论 -
在Java中使用协程(Coroutine)
各种语言在实现Coroutine方式的支持时,多数都采用了Actor Model来实现,Actor Model简单来说就是每个任务就是一个Actor,Actor之间通过消息传递的方式来进行交互,而不采用共享的方式,Actor可以看做是一个轻量级的进程或线程,通常在一台4G内存的机器上,创建几十万个Actor是毫无问题的。对于Java应用而言,传统方式下为了支持高并发,由于一个线程只能用于处理一转载 2013-09-21 13:28:48 · 27596 阅读 · 0 评论 -
Kilim框架的Actor并发模型
1.Kilim是一个Java消息传递框架,它提供了超轻量级的线程和工具,可以在这些线程之间进行快速、安全、零复制的消息传递。2.Kilim的核心在于Mailbox跨线程共享内存,没有锁或同步,Mailbox支持多生产者,单消费者队列。3.Kilim的Actor协程场景存在大量的处理线程,都消耗在等待后端的处理,做异步化才有意义4.Actor采取的这种类似消息机制的方式,实际在守转载 2014-01-16 01:39:36 · 1814 阅读 · 0 评论 -
Disruptor 框架源码分析
Disruptor 是一个高性能异步处理框架,也可以认为是一个消息通信框架,它本质上为生产者-消费者模型。Disruptor消息处理流程Disruptor核心类和接口EventHandler:用户提供具体的实现,在里面实现事件的处理逻辑。Sequence:代表事件序号或一个指向缓存某个位置的序号。WaitStrategy:功能包括:当没有可消费的事件时,根据特定原创 2014-01-19 16:02:37 · 4051 阅读 · 0 评论 -
Disruptor(无锁并发框架)-发布
假如你生活在另外一个星球,我们最近开源了一套高性能的基于消息传递的开源框架。下面我给大家介绍一下如何将消息通过Ring buffer在无锁的情况下进行处理。在深入介绍之前,简介介绍下Ring buffer的工作原理。1.ring buffer是由一个大数组组成的。2.所有ring buffer的“指针”(也称为序列或游标)是java long类型的(64位有符号数)转载 2014-01-29 21:11:34 · 1141 阅读 · 0 评论 -
synchronized的底层JVM实现机制
Java synchronized 包含两方面的含义互斥JVM 通过对象锁来实现互斥:typedef struct object {uintptr_t lock;Class *class;} Object协作协作是通过 Object wait, notify/notifyAll 方法实现的。对应到JVM 的底层术语,这一机制叫做 monitor:typedef转载 2014-01-04 22:08:24 · 4996 阅读 · 0 评论 -
AbstractQueuedSynchronizer的介绍和原理分析
简介提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架。该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础。使用的方法是继承,子类通过继承同步器并需要实现它的方法来管理其状态,管理的方式就是通过类似acquire和release的方式来操纵状态。然而多线程环境中对状态的操纵必须确保原子性,因此子类对于状态的把握,需要使用这个同步器转载 2014-01-04 15:21:14 · 959 阅读 · 0 评论 -
Java并发编程中CountDownLatch和CyclicBarrier的使用
在多线程程序设计中,经常会遇到一个线程等待一个或多个线程的场景,遇到这样的场景应该如何解决?如果是一个线程等待一个线程,则可以通过await()和notify()来实现;如果是一个线程等待多个线程,则就可以使用CountDownLatch和CyclicBarrier来实现比较好的控制。下面来详细描述下CountDownLatch的应用场景:例如:百米赛跑:8名运动员同时起跑,由于速转载 2013-12-18 23:03:47 · 998 阅读 · 0 评论 -
从JVM并发看CPU内存指令重排序(Memory Reordering)
这两天,我拜读了 Dennis Byrne 写的一片博文Memory Barriers and JVM Concurrency,文中提到:对主存的一次访问一般花费硬件的数百次时钟周期。处理器通过缓存(caching)能够从数量级上降低内存延迟的成本这些缓存为了性能重新排列待定内存操作的顺序。也就是说,程序的读写操作不一定会按照它要求处理器的顺序执行。这段话是作者对内存屏障重要性的定义。转载 2013-08-04 23:11:54 · 987 阅读 · 0 评论 -
volatile原理与技巧
为什么使用volatile比同步代价更低? 同步的代价, 主要由其覆盖范围决定, 如果可以降低同步的覆盖范围, 则可以大幅提升程序性能.而volatile的覆盖范围仅仅变量级别的. 因此它的同步代价很低.volatile原理是什么?volatile的语义, 其实是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我.(工作内存详见java内存模型)因此, 当多核或多线程在访转载 2013-08-04 23:25:51 · 808 阅读 · 0 评论 -
Actor并发模型&基于共享内存线程模型
先从著名的c10k问题谈起。有一个叫Dan Kegel的人在网上(http://www.kegel.com/c10k.html)提出:现在的硬件应该能够让一台机器支持10000个并发的client。然后他讨论了用不同的方式实现大规模并发服务的技术,归纳起来就是两种方式:一个client一个thread,用blocking I/O;多个clients一个thread,用nonblocking I转载 2013-09-12 23:15:10 · 6002 阅读 · 1 评论 -
Java 开发 2.0: Kilim 简介
对于软件开发人员而言,调试多线程应用程序中的非确定缺陷是最痛苦的工作。因此,像大多数人一样,我钟爱使用 Erlang 和 Scala 等函数语言进行并发编程。Scala 和 Erlang 都采用了角色模型来进行并发编程,没有采用线程概念。围绕角色模型的创新并不仅限于语言本身,角色模型也可供 Kilim 等基于 Java 的角色框架使用。Kilim 对角色模型的使用非常直观,稍后您将看到,该转载 2013-09-15 22:37:19 · 1133 阅读 · 0 评论 -
关于Java协程和Kilim的一些概念
最近了解了一下基于协程来做异步话的场景。一些基本概念写在这里。 多任务调度方面,操作系统怎么搞的? 一种是抢占式,指操系统给每个任务一定的执行时间片,在到达这个时间片后,如果任务仍然没有释放对CPU的占用,则操作系统强制释放,这是目前多数操作系统实现的方式。 一种是协作式,指操作系统按照任务的顺序来分配CPU,每个转载 2013-09-20 23:23:18 · 1983 阅读 · 0 评论 -
协程和异步
摘要: 本文介绍协程的基本概念,以及协程在异步IO编程模式里起的作用——大大简化异步回调的实现与逻辑处理。什么协程协程这个概念在计算机科学里算是一个老概念了,随着现代计算机语言与多核心处理器的普及,似乎也有普及之势。协程是与例程相对而言的。熟悉C/C++语言的人都知道,一个例程也就是一个函数。当我们调用一个函数时,执行流程进入函数;当函数执行完成后,执行流程返回给上层函数或例程。期间,转载 2013-09-20 23:33:36 · 15284 阅读 · 6 评论 -
Java协程框架----Kilim实现机制解析
java语言处理多任务的模式是基于多线程,java语言级别原生并不支持协程,我们想要java语言支持协程,就需要在线程和协程之间架起一道桥梁。在某个事件点(我们成为挂起点)上,我们在应用级别备份当前任务在线程上的调用栈信息(包括局部变量和操作栈上的数据),释放线程,让它去执行下一个任务;等某些事件被触发的时候,重新执行刚才的任务,用之前备份的调用栈信息恢复线程的调用栈,从挂起点开始执行。来看看转载 2013-09-21 14:32:55 · 4319 阅读 · 0 评论 -
JVM并发机制的探讨——内存模型、内存可见性和指令重排序
并发本来就是个有意思的问题,尤其是现在又流行这么一句话:“高帅富加机器,穷矮搓搞优化”。从这句话可以看到,无论是高帅富还是穷矮搓都需要深入理解并发编程,高帅富加多了机器,需要协调多台机器或者多个CPU对共享资源的访问,因此需要了解并发,穷矮搓搞优化需要编写各种多线程的代码来压榨CPU的计算资源,让它在同一时刻做更多的事情,这个更需要了解并发。在我前一篇关于并发的文章http://my.os转载 2013-11-19 00:12:26 · 1151 阅读 · 0 评论 -
深入JVM锁机制-synchronized
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。 数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令转载 2014-01-01 23:40:57 · 1067 阅读 · 0 评论 -
深入JVM锁机制-Lock
前文(深入JVM锁机制-synchronized)分析了JVM中的synchronized实现,本文继续分析JVM中的另一种锁Lock的实现。与synchronized不同的是,Lock完全用Java写成,在java这个层面是无关JVM实现的。在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadWriteLock(实现类转载 2014-01-01 23:42:00 · 1177 阅读 · 0 评论 -
JVM底层如何实现synchronized
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家转载 2014-10-11 00:10:36 · 3380 阅读 · 0 评论