`
chong_zh
  • 浏览: 72299 次
  • 来自: 杭州
社区版块
存档分类
最新评论

三个并发编程工具包java.util.concurent/locks/atomic的概念厘清

 
阅读更多
Java提供了三个并发编程功能包,它们是:
  • java.util.concurent
  • java.util.concurent.locks
  • java.util.concurent.atomic


本文意在厘清这三个包的概念结构,关于具体功能的实现,将另文详记。

1. Overview
java.util.concurent/locks/atomic三个包主要提供了以下三块功能:
功能涉及包
一组线程安全数据结构concurrent+atomic
一组比synchronized关键子功能更丰富的同步工具concurrent+locks
一套线程池实现框架concurrent

本文接下来,按照功能整理这些包的逻辑结构。

2 线程安全的数据结构
2.1 java.util.concurent.atomic包
首先,java.util.concurent.atomic包的所有类,都是用于提供一组不需要进行线程同步,可以安全的进行并发操作的变量类,罗列如下:
  • AtomicBoolean
  • AtomicInteger
  • AtomicIntegerArray
  • AtomicIntegerFieldUpdater
  • AtomicLong
  • AtomicLongArray
  • AtomicLongFieldUpdater
  • AtomicMarkableReference
  • AtomicReference
  • AtomicReferenceArray
  • AtomicReferenceFieldUpdater
  • AtomicStampedReference
  • DoubleAccumulator
  • DoubleAdder
  • LongAccumulator
  • LongAdder


2.2 java.util.concurent提供的复杂线程安全数据结构
在java.util.concurent.atomic包的基础上,java.util.concurent包实现了一组复杂的线程安全数据结构。可以分为以下几个小组:
java.util.AbstractQueue的子类:
java.util.AbstractQueue<E> (implements java.util.Queue<E>)
    java.util.concurrent.ArrayBlockingQueue<E> 
    java.util.concurrent.ConcurrentLinkedQueue<E> 
    java.util.concurrent.DelayQueue<E>
    java.util.concurrent.LinkedBlockingDeque<E>
    java.util.concurrent.LinkedBlockingQueue<E>
    java.util.concurrent.LinkedTransferQueue<E>
    java.util.concurrent.PriorityBlockingQueue<E>
    java.util.concurrent.SynchronousQueue<E>


java.util.AbstractSet的子类:
java.util.AbstractSet<E>
    java.util.concurrent.ConcurrentSkipListSet<E>
    java.util.concurrent.CopyOnWriteArraySet<E>


java.util.AbstractCollection的子类:
java.util.AbstractCollection<E>
    java.util.concurrent.ConcurrentLinkedDeque<E>
    java.util.concurrent.ConcurrentHashMap.KeySetView<K,V>
    java.util.concurrent.CopyOnWriteArrayList<E> 


java.util.AbstractMap的子类:
java.util.AbstractMap<K,V>
    java.util.concurrent.ConcurrentHashMap<K,V>
    java.util.concurrent.ConcurrentSkipListMap<K,V>


3 功能丰富的同步工具
3.1 Overview

3.2 java.util.concurrent.locks包
3.1.1 Synchronizer
java.util.concurrent.locks包中最核心类是AbstractQueuedSynchronizer,它定义了实现线程安全数据结构的最基本的操作,主要是以下几类:
  • acquire
  • release
  • compareAndSetState
  • waitting queue操作

AbstractOwnableSynchronizer是其父类,只定义了两个waitting queue操作:getExclusiveOwnerThread()和setExclusiveOwnerThread。

AbstractQueuedLongSynchronizer是AbstractQueuedSynchronizer的兄弟类,与AbstractQueuedSynchronizer的唯一区别在于其状态用long型数据表示。

这三个Synchronizer的底层实现不是依赖synchronized的,而是依赖Unsafe

3.1.2 Lock
在Synchronizer的基础上,java.util.concurrent.locks包实现了锁的概念,包括Lock接口的实现类和ReadWriteLock接口的实现类。

3.1.3 LockSupport
LockSupport提供了并发编程中的park语义,它替代了已经deprecated的Thread.suspend()/resume()。具体原因:Java Thread Primitive Deprecation

3.3 功能更强大的同步工具
在java.util.concurrent.locks包的基础上,java.util.concurrent实现了一些列功能更为复杂的同步工具类:
  • java.util.concurrent.CountDownLatch
  • java.util.concurrent.CyclicBarrier
  • java.util.concurrent.Exchanger<V>
  • java.util.concurrent.Semaphore
  • java.util.concurrent.Phaser


4 线程池框架
4.1 ExecutorService
线程池的主体功能有两种实现,第一种由实现ExecutorService接口的一系列类来实现:
java.util.concurrent.AbstractExecutorService
    java.util.concurrent.ForkJoinPool
    java.util.concurrent.ThreadPoolExecutor 
    java.util.concurrent.ScheduledThreadPoolExecutor


一个使用Executor Serivce是简单例子如下所示:
ExecutorService executorService = Executors.newFixedThreadPool(10);
executorService.execute(new Runnable() 
{
    public void run() 
    {
        System.out.println("Asynchronous task");
    }
});
executorService.shutdown();


第二种由实现CompletionService接口的类实现,这样的类只有一个:java.util.concurrent.ExecutorCompletionService。A service that decouples the production of new asynchronous tasks from the consumption of the results of completed tasks. Producers submit tasks for execution. Consumers take completed tasks and process their results in the order they complete.

4.2 Future
一系列实现Future接口的类实现了异步编程中的Promise语义:
java.util.concurrent.CompletableFuture<T>
java.util.concurrent.ForkJoinTask<V>
    java.util.concurrent.CountedCompleter<T>
    java.util.concurrent.RecursiveAction
    java.util.concurrent.RecursiveTask<V>
java.util.concurrent.FutureTask<V>

调用可能有较长时间阻塞/等待的方法时,可以先返回一个轻量级的Future对象,方法执行的真正结果可以通过调用Future.get()获取。

5 其他相关类的说明
  • java.util.concurrent.Executors:Executor, ExecutorService, ScheduledExecutorService, ThreadFactory,Callable 等的工厂/工具类。
  • java.util.concurrent.ThreadLocalRandom:java.util.Random类的子类,A random number generator isolated to the current thread.
  • java.util.concurrent.ForkJoinWorkerThread:专门用于执行 ForkJoinTasks的Thread子类

分享到:
评论

相关推荐

    java并发工具包 java.util.concurrent中文版用户指南pdf

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    java并发工具包 java.util.concurrent中文版pdf

    ### Java并发工具包 `java.util.concurrent` 知识点详解 #### 一、引言 随着多核处理器的普及和应用程序复杂度的增加,多线程编程成为了现代软件开发不可或缺的一部分。为了简化并发编程的复杂性,Java 5 引入了 `...

    java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream解决方法

    包含3个jar(修改后的javaee.jar可以接覆盖原jar,和mail.jar和activition.jar)和一个文档,测试通过。 JavaMail的java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream错误 原因: MyEclipse...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    用java.util.zip包现数据压缩与解压

    ### 使用 Java.util.zip 包实现数据压缩与解压 在计算机科学领域,数据压缩技术是一项重要的功能,它能够帮助减少存储空间的需求以及提高网络传输效率。本文将通过一系列的示例来详细介绍如何利用 Java 中的 `java....

    java并发工具包 java.util.concurrent中文版-带书签版

    Java并发工具包(java.util.concurrent)是Java平台上用于高效、安全地处理多线程编程的重要组件。这个包包含了丰富的并发工具类,旨在帮助开发者构建高度并发的程序,提高程序的性能和可伸缩性。本资源是该工具包的...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版pdf

    Java并发工具包java.util.concurrent是Java平台在Java 5版本中引入的一组新的并发编程类库,旨在帮助Java开发者更容易地实现复杂的并发程序。这一包的出现,极大地简化了开发者在处理线程和数据同步时所遇到的难题,...

    java.util包

    Java提供日期(Data)类、日历(Calendar)类,随机数(Random)类,堆栈(Stack)、向量(Vector) 、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构

    并发编程笔记(httpswww.bilibili.comvideoav84491203p=279).zip

    Java的并发库`java.util.concurrent`提供了高级并发工具,如ExecutorService、Future、CountDownLatch等,方便开发者高效地进行并发编程。 **并发编程代码示例** 压缩包中的`并发编程代码.zip`包含了实际的并发编程...

    eclipse3.4关于hibernate tools使用时,出错java.lang.NoClassDefFoundError: org/eclipse/ui/internal/util/SWTResourceUtil

    打到org/eclipse/ui/internal/util/SWTResourceUtil.class 用winrar打开,同时也打开3.4的org.eclipse.ui.workbench_3.4.0.I20080606-1300.jar 到org/eclipse/ui/internal/util目录下 把SWTResourceUtil.class ...

    java.util.concurrent.uml.pdf

    标题中提到了“java.util.concurrent.uml.pdf”,这表明文件是一份Java并发编程工具包java.util.concurrent的UML(统一建模语言)类结构图的PDF格式文件。UML图能够帮助开发者理解Java并发包中的类、接口及其关系,...

    java.util.concurrent 测试源文件

    这个包包含了大量的工具类和接口,极大地简化了并发编程的复杂性,提高了程序的性能和可伸缩性。本测试源文件主要是针对JUC并发编程的笔记、API理解和原子类CAS的实践。 首先,让我们深入了解`java.util.concurrent...

    Mail 错误com/sun/mail/util/LineInputStream。javaee.jar 开发包

    该开发包是解决 JavaMail 发送邮件报错:java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream错误 ava.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream 使用方法: 将javaee.jar ...

    java.util.concurrent 学习ppt

    Java.util.concurrent是Java 5.0引入的一个重要包,它为多线程编程提供了一组高级并发工具。这个包的设计者是Doug Lea,它的出现是JSR-166的一部分,也被称作Tiger更新。Java.util.concurrent的引入是为了解决传统...

    wsdl文件解析

    import java.util.Iterator; import java.util.List; import java.util.regex.*; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; //import org.dom4j.io.OutputFormat; ...

    java.util.concurrent

    java.util.concurrent总体概览图。 收取资源分3分。...java.util.concurrent主要包括5个部分executor,colletions,locks,atomic,tools。 该图详细的列举了并发包下面的结构,包含所有接口和具体实现类。

    Java高性能线程库(java.util.concurrent包的补充)

    一个高性能的Java线程库,该库是 JDK 1.5 中的 java.util.concurrent 包的补充,可用于基于并发消息机制的应用。该类库不提供远程的消息功能,其设计的宗旨是实现一个内存中的消息传递机制. 主要特点有: * All ...

Global site tag (gtag.js) - Google Analytics