并发编程
娄继涛
生有涯,知无涯;
展开
-
Java 并发:Lock 框架详解
摘要: 我们已经知道,synchronized 是java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问,但 synchronized 粒度有些大,在处理实际问题时存在诸多局限性,比如响应中断等。Lock 提供了比 synchronized更广泛的锁操作,它能以更优雅的方式处理线程同步问题。本文以synchronized与Lock的对比...转载 2018-06-12 10:33:14 · 355 阅读 · 0 评论 -
JUC学习系列十(异步计算 FutureTask)
public interface Future<V>Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Fut...原创 2018-07-26 10:48:54 · 604 阅读 · 0 评论 -
JUC学习系列九(同步点 Exchanger)
可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger 可能被视为 SynchronousQueue 的双向形式。Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用。内存一致性效果:对于通过 Exchanger 成功交换对象的每对线程,每个线程中在 excha...原创 2018-07-25 11:03:05 · 418 阅读 · 0 评论 -
JUC学习系列八(信号量 Semaphore)
一个计数信号量。从概念上讲,信号量维护了一个许可集。Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。通常,应该将用于控制资源访问的信号量初始化为公平的,以确保所有线程都可访问资源。为其他的种类的同步控制使用信号量时,非公平排序的吞吐量优势通常要比公平考虑更为重要。此类还提供便捷的方法来同时 acquire 和释放多个许可。小心,在未将公平设置为 true 时使用这些方法...原创 2018-07-25 10:05:04 · 1849 阅读 · 0 评论 -
JUC学习系列七(同步屏障 CyclicBarrier)
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到...原创 2018-07-24 17:49:14 · 914 阅读 · 0 评论 -
JUC学习系列五(ThreadLocal)
该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。每个线程都保持对其线程局部变量副本的隐式引用,只要线程...原创 2018-07-24 11:42:51 · 624 阅读 · 0 评论 -
JUC学习系列四(条件锁 condition)
Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。Condition 实例实质上被绑定到一个锁上...原创 2018-07-24 11:04:37 · 750 阅读 · 0 评论 -
JUC学习系列二(线程池Executors与ThreadPoolExecutor)
概念说明 Executor:一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable command), ExecutorService:是一个比Executor使用更广泛的子类接口,其提供了生命周期管理的方法,以及可跟踪一个或多个异步任务执行状况返回Future的方法AbstractExecutorService:ExecutorSer...原创 2018-06-28 18:02:50 · 526 阅读 · 0 评论 -
JUC学习系列三(队列同步器AQS)
详细说明:http://tool.oschina.net/apidocs/apidoc?api=jdk-zh为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量、事件,等等)提供一个框架。此类的设计使用的是模板方法模式。应该将子类定义为非公共内部帮助器类,可用它们来实现其封闭类的同步属性。类 AbstractQueuedSynchronizer 没有实现任何同步接口。而是定义了...原创 2018-07-03 15:40:08 · 444 阅读 · 0 评论 -
JUC学习系列一(阻塞队列BlockingQueue)
阻塞队列 BlockingQueuejava.util.concurrent 包里的 BlockingQueue 接口表示一个线程安放入和提取实例的队列。本小节我将给你演示如何使用这个 BlockingQueue。BlockingQueue 用法BlockingQueue 通常用于一个线程生产对象,而另外一个线程消费这些对象的场景。下图是对这个原理的阐述:一个线程往里边放,另外一个线程从里边取的...原创 2018-06-27 17:52:48 · 1911 阅读 · 1 评论 -
线程的状态与切换
Java中的线程的生命周期大体可分为5种状态。1. 新建/初始化(NEW):新创建了一个线程对象。2. 可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。3. 运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执...原创 2018-06-26 10:32:23 · 305 阅读 · 0 评论 -
并发与并行
一、并发模式和并行模式并发是比较常见的,寻找良好的并发问题解决方案,一直是程序员们要努力的目标。二、并发编程的重要性原创 2018-06-19 10:36:08 · 192 阅读 · 0 评论 -
java锁状态概念
一:对象头HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 HotSpot虚拟机的对象头(Object Header)包括两部分信息,第一部分用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,这部分数据的长度...转载 2018-06-29 15:29:23 · 1732 阅读 · 0 评论 -
线程的两种实现,为什么使用runnable接口的居多
一、线程实现的两种方式 1、继承Thread成为线程类; 2、实现Runnable接口,成为线程任务类。二、Thread类部分源码 * @author unascribed * @see Runnable * @see Runtime#exit(int) * @see #run() * @see #stop() * @since JDK1...原创 2018-06-14 17:24:22 · 2964 阅读 · 0 评论 -
方法锁,对象锁,类锁的区别和用法
在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法。因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识。 java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁。获得内置锁的唯一途原创 2018-04-13 08:43:38 · 21082 阅读 · 4 评论 -
JUC学习系列十一(并发类容器)
首先了解一下并发类容器和同步类容器的概念,以及这两类的区别:一、同步类容器同步类容器都是线程安全的,但在某些场景下可能需要加锁来保护复合操作。复合类操作如:迭代(反复访问元素,遍历完容器中的所有元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、以及条件运算。这些复合操作在多线程并发的修改容器时,可能会表现出意外的行为,最经典的便是ConcurrentModificationExcep...原创 2018-07-27 09:35:48 · 786 阅读 · 0 评论