Java并发编程系列之三JUC概述

Posted 程序员田同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java并发编程系列之三JUC概述相关的知识,希望对你有一定的参考价值。

上篇文章为解决多线程中出现的同步问题引入了锁的概念,上篇文章介绍的是Synchronized关键字锁,本篇文章介绍更加轻量级的锁Lock接口及引出JUC的相关知识。

本文不力争阐释清楚JUC框架的所有内容,而是站在一定的高度下,了解Juc下包的设计与实现。

一、LOCK锁概述

实现同步的另外一种方式是Lock锁。

Lock锁是一个接口,其所有的实现类为:

  • ReentrantLock(可重入锁)
  • ReentrantReadWriteLock.ReadLock(可重入读写锁中的读锁)
  • ReentrantReadWriteLock.WriteLock(可重入读写锁中的写锁)

与synchronized不同的是,使用LOCK锁与其有六个区别

1 synchronized 是Java内置关键字,Lock 是一个接口
2 synchronized 无法判断是否获取锁,Lock 可以判断是否获取锁
3 synchronized 可以自动释放锁,Lock 必须手动释放锁,如果不释放就会造成死锁
4 同一个锁对象,线程A synchronized获取之后,线程B只能等待,造成阻塞,Lock 并不会等待
5 synchronized 可重入锁,不可中断,非公平锁,Lock 可重入锁,可以判断,非公平锁(可设置)
6 synchronized 适合少量同步代码,Lock 适合大量同步代码

Lock接口位于 java.util.concurrent.locks 包下,在父级的包下有两个包。

  • java.util.concurrent:包下主要是包括并发相关的接口与类,阻塞队列、线程池等,里面包含 59 个类或者接口
  • java.util.concurrent.atomic: 该包下主要包括原子性操作相关的类,比如常用的AtomicInteger、AtomicBoolean、AtomicIntegerArry等,里面包含18个类或者接口

其中父级的包java.util .concurrent涉及到Java多线程最重要的一部分——JUC编程。

二、JUC概述

JUC就是java.util .concurrent工具包的简称。这是一个处理线程的工具包,JDK 1.5开始出现的,在此包中增加了在并发编程中很常用的工具类。

用于定义类似于线程的自定义子系统,包括线程池,异步 IO 和轻量任务框架;

还提供了设计用于多线程上下文中的 Collection 实现等;

下图为JUC涉及到的所有知识点。

JUC应该包括五个部分的内容。

1、Lock框架

① 接口: Condition
②接口: Lock
③接口: ReadWriteLock
④抽象类: AbstractOwnableSynchonizer
⑤抽象类(long): AbstractQueuedLongSynchronizer
⑥ 核心抽象类(int): AbstractQueuedSynchonizer
⑦锁常用类: LockSupport
⑧锁常用类: ReentrantLock
⑨锁常用类: ReentrantReadWriteLock
⑩锁常用类: StampedLock

2、Tools类

①工具常用类: CountDownLatch
②具常用类: CyclicBarrier
③工具常用类: Phaser

④ 工具常用类: Semaphore

⑤工具常用类: Exchanger

3、Collections: 并发集合

并发集合的类结构关系

①Queue: ArrayBlockingQueue
②Queue: LinkedBlockingQueue
③Queue: LinkedBlockingDeque
④Queue: ConcurrentLinkedQueue
⑤ Queue: ConcurrentLinkedDeque
⑥ Queue: DelayQueue
⑦ Queue: PriorityBlockingQueue
⑧Queue: SynchronousQueue
⑨Queue: LinkedTransferQueue
⑩List: CopyOnWriteArrayList
⑩①Set: CopyOnWriteArraySet
⑩②Set: ConcurrentSkipListSet
⑩③ Map: ConcurrentHashMap

详细分析请看: [JUC并发集合: ConcurrentHashMap详解](), 包含了对JDK 7和JDK 8版本的源码分析。

⑩④ Map: ConcurrentSkipListMap

4、Atomic: 原子类

其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入,这只是一种逻辑上的理解。

实际上是借助硬件的相关指令来实现的,不会阻塞线程(或者说只是在硬件级别上阻塞了)。

①基础类型:AtomicBoolean,AtomicInteger,AtomicLong
②数组:AtomicIntegerArray,AtomicLongArray,BooleanArray
③引用:AtomicReference,AtomicMarkedReference,AtomicStampedReference
④FieldUpdater:AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater

5、Executors: 线程池

线程池类结构关系

①接口: Executor
② ExecutorService
③ScheduledExecutorService
④AbstractExecutorService
⑤FutureTask
⑥ 核心: ThreadPoolExecutor
⑦核心: ScheduledThreadExecutor
⑧核心: Fork/Join框架
⑨工具类: Executors

通过以上的章节我们不难看出,JUC体系的内容也是非常庞大的,通过这篇文章能对JUC的整个体系能有所了解我们的目的就达到了。

接下来的文章会分明别类的对这些类和接口进行详细的阐述分析。

以上是关于Java并发编程系列之三JUC概述的主要内容,如果未能解决你的问题,请参考以下文章

java并发编程工具类JUC第六篇:SynchronousQueue同步队列

JUC系列LOCK框架系列之三 同步工具类 CountDownLatch

Java并发专题之十juc-locks之线程池框架概述

Java Review - 并发编程_原子操作类原理剖析

尚硅谷JUC高并发编程学习笔记JUC简介与Lock接口

尚硅谷JUC高并发编程学习笔记JUC简介与Lock接口