并发系列(六)-----concurrent的简单介绍

一 简介

  concurrent包是jdk1.5引入的重要的包,主要代码由大牛Doug Lea完成。这个包下的一些类如果用好了可以很方便的保证数据在多线程下操作的正确性。就比如说线程共享的i++,如果使用concurrent包下的Atomic系列类可以很方便的解决这个问题。这篇文章简单的介绍Concurrent包,让你对Concurrent的整体有一个大体的了解,以及简单的了解它的实现原理。

二 concurrent的组成

   concurrent包组成由atomic包和lock包以及一些类组成,打开开发工具锁定到concurrent看一看。

 1. BlockingQueue,Callable,ConcurrentHashMap,ExecutorService, Semaphore等  
 2.java.util.concurrent.atomic:提供所有原子操作的类, 如AtomicInteger, AtomicLong等;  
 3. java.util.concurrent.locks:提供锁相关的类, 如Lock, ReentrantLock, ReadWriteLock, Condition等;

下面是网上收集的一张图

并发系列(六)-----concurrent的简单介绍

三 公平锁与非公平锁  

  公平锁:加锁前检查是否有排队等待的线程,优先排队等待的线程,先来先得

  非公平锁:加锁时不考虑排队等到的问题,之间尝试获取锁,获取不到自动到对尾等待

四 简单的原理说明

由于Java的CAS同时具有volatile读和volatile写的内存语义,因此Java线程之间的通信现在有了下面4种方式。

1.A线程写volatile变量,随后B线程读这个volatile变量。

2.A线程写volatile变量,随后B线程用CAS更新这个volatile变量。

3.A线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volatile变量。

4.A线程用CAS更新一个volatile变量,随后B线程读这个volatile变量。

一定要理解上面这四种线程之间的通信,因为在concurrent包中大量的用到了其中的语句含义,如果不明白其中的语义请看以前的文章。

concurrent包的源代码实现,会发现一个通用化的实现模式

首先,声明共享变量为volatile。

然后,使用CAS的原子条件更新来实现线程之间的同步。

同时,配合以volatile的读/写和CAS所具有的volatile读和写的内存语义来实现线程之间的通信。

AQS(concurrent的重点),非阻塞数据结构和原子变量类(java.util.concurrent.atomic包中的类),这些concurrent包中的基础类都是使用这种模式来实现的,而concurrent包中的高层类又是依赖于这些基础类来实现的。从整体来看,concurrent包的实现示意图如所示。

并发系列(六)-----concurrent的简单介绍