引言

JUC即java.util.concurrent,是java提供的用于多线程处理的工具类库。重点关注 ConcurrentXXX、AtomicXXX、Executor、Caller&&Future、Queue、Locks。

打开jdk包,JUC代码就在rt.jar包中,concurrent下有atomic和locks两个package,并且还有concurrentXXX、Executor、Future、Queue等。想查看源码的话,JDK 安装的目录下有个 src.zip —— 这就是源码。

AtomicXXX,atomic即原子类,如图:

常用工具类及其作用

1、基本类型的原子类

AtomicBoolean,AtomicInteger,AtomicLong,DoubleAccumulator,DoubleAdder,LongAccumulator,LongAdder 都是基本数据类型的原子类,更适合高并发场景。

以 AtomicLong 和 LongAdder 来说,AtomicLong 是通过 unsafe 类实现的,基于 CAS。unsafe 类是底层工具类,JUC 中很多类的底层都使用到了 unsafe 包中的功能。unsafe 类提供了类似 C 的指针操作,提供 CAS 等功能。并且 unsafe 类中的所有方法都是 native 修饰的。在说 AtomicXXX 之前,已经说过了关于 CAS的相关知识,并发与多线程【四】——同步与互斥

LongAdder、DoubleAccumulator,DoubleAdder,LongAccumulator 四个类是 JDK1.8 中提供的更高效的操作类。LongAdder 基于 Cell 实现,使用分段锁思想,是一种空间换时间的策略,更适合高并发的场景。

LongAccumulator 提供了比 LongAdder 更强大的功能,能够指定对数据的操作规则,例如可以把数据的相加操作改为相乘操作。

2、对对象的原子读写功能的类

AtomicReference、AtomicStampedReference、AtomicMarkableReference 类中提供了对对象的原子读写功能,后两个类用于解决前面说过的 ABA 问题,分别基于时间戳和标记位来解决问题。

3、锁相关的类

锁相关的类,ReentrantLock、ReentrantReadWriteLock、StampedLock、LockSupport

ReentrantLock 前面已经说过是重入锁。与 ReentrantLock 独占锁不同的是,Sempaphore 是共享锁,允许多个线程共享资源,适用于限制使用共享资源线程数量的场景,例如100辆车要使用20个停车位,那么最多允许20个车占用停车位。

StampedLock是 JDK1.8 改进的读写锁,是使用一种 CLH 的乐观锁,能够有效防止写饥饿。所谓写饥饿是指在多线程读写时,读线程访问非常频繁,导致总是有读线程占用资源,写线程很难加上写锁。

4、异步执行相关的类

Executors、ForkJoinPool、FutureTask、CompletableFuture是异步执行相关的类。

JDK1.8中提供的 CompletableFuture 可以支持流试调用,可以很方便的进行多 future 的组合使用,例如可以同时执行两个异步任务,然后对执行结果进行合并处理,还可以很方便的设置完成时间。

JDK1.7中提供的 ForkJoinPool 采用分治思想,将大任务分解成多个小任务处理,然后再合并处理结果。ForkJoinPool 的特点是使用工作窃取算法,可以有效平衡多任务时间长短不一的场景。

5、常用的阻塞队列

线程池讲解的时候已经简单介绍过阻塞队列,这里补充一下LinkedBlockingDeque、ArrayBlockingQueue

LinkedBlockingDeque 是双端队列,也就是可以分别从队头和队尾操作入队、出队。

ArrayBlockingQueue 是单端队列,只能从队尾入队,队头出队。

6、控制多线程协作时使用的类

CountdownLatch、CyclicBarrier、Semaphore 是控制多线程协作时使用的类。

CountdownLatch 实现计数器功能,可以用来控制等待多个线程执行任务后进行汇总。

CyclicBarrier 可以让一组线程等待至某个状态之后,再同时执行,一般在测试时使用,可以让多线程更好的并发执行。

Semaphore 用来控制对共享资源的访问并发度。

7、常用的集合类

ConcurrentHashMap、CopyOnWriteArrayList是常用的两个集合类。

ConcurrentHashMap 可以拉出来一章单独讲。

这里了解一下 CopyOnWriteArrayList,COW 通过写入数据时进行 copy 修改,然后更新引用的方式,来消除并行读写中的锁使用,比较适合读多写少,数据量比较小,但是并发非常高的场景。

扩展

  • https://blog.csdn.net/a953713428/article/details/54384166

Java 语言特性【一】——JUC(Java 并发工具包)的更多相关文章

  1. Java语言的特点以及Java与C/C++的异同

    Java语言的特点 1. Java为纯面向对象的语言,能够直接反应现实生活中的对象,容易理解,编程更容易. 2.跨平台,java是解释性语言,编译器会把java代码变成中间代码,然后在JVM上解释执行 ...

  2. 《快乐编程大本营》java语言训练班 2课:java的变量

    <快乐编程大本营>java语言训练班 2课:java的变量 1变量介绍 2变量分类,数值变量 3变量分类-字符串变量 4变量分类-布尔变量 5变量分类-对象 http://code6g.c ...

  3. Java语言特性

    Java的语言特性: 1.语法相对简单 2.面向对象 3.分布性 4.可移植性 5.安全性 6.健壮性 7.解释性 8.多线程 9.动态性与并发性 Java中的面向对象编程: 面向对象程序设计(Obj ...

  4. java语言特性概述

    一.前言 我们都知道java是面向对象的编程,其中四个基本特性:抽象.封装.继承.多态.这四个特性,概括起来可以这么理解,抽象.封装.继承是多态的基础,多态是抽象.封装.继承的表现. 二. JAVA ...

  5. [原]Java修炼 之 基础篇(一)Java语言特性

    学习软件开发,首先要选择的就是选择需要采用的编程语言,考虑语言本身的优缺点和实际需求,综合评价之后选择相关的语言进行系统开发.本篇博客开始就从近年来比较流行的Java开始为大家讲起. 背景 1995年 ...

  6. Java 语言特性

    介绍以下几种语言特性: Java5的特性 1.静态引用 2.可变参数 3.自动装箱和拆箱  包装类的缓存设计 4.枚举 一.静态引用(语法糖,不推荐使用,了解一下即可) 先看看普通的引用,就是impo ...

  7. 【Java语言特性学习之一】设计模式

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  8. 【Java语言特性学习之三】Java4种对象引用

    为了更灵活的控制对象的生命周期,在JDK1.2之后,引用被划分为(引用的级别和强度由高到低)强引用.软引用.弱引用.虚引用四种类型,每种类型有不同的生命周期,它们不同的地方就在于垃圾回收器对待它们会使 ...

  9. Java 语言特性之 Annotation 注解

    利用 Java 的反射机制,可以在运行时获取 Java 类的注解信息. 注解 注解的特性 注解是 Java 5 的一个新特性,是插入代码中的一种注释或者说是元数据.注解并不是程序代码,可以对程序作出解 ...

随机推荐

  1. pandas包 —— drop()、sort_values()、drop_duplicates()

    一.drop() 函数 当你要删除某一行或者某一列时,用drop函数,它不改变原有的df中的数据,而是返回另一个dataframe来存放删除后的数据. 1.命令: df.drop() 删除行:df.d ...

  2. 027、MySQL字符串替换函数,文本替换函数,字符串填充函数

    #文本填充 ,'); #ABC12121212121212121 #文本替换 SELECT REPLACE('田攀520','攀','ABC'); #田ABC520 不忘初心,如果您认为这篇文章有价值 ...

  3. 使用jquery版本的viewer.js图片更新的问题

    参考博客: 使用jquery版本的viewer.js图片更新的问题 - cc_fys的博客 - CSDN博客 https://blog.csdn.net/cc_fys/article/details/ ...

  4. mysql 存储引擎入门

  5. 清除windows激活信息

    1.管理员运行命令提示符 在命令提示符中输入 slmgr /upk---删除当前KMS密匙 出现"成功地卸载了产品密匙"后,继续依次执行下面两个命令 slmgr /ckms---此 ...

  6. java代码静态分析工具

    需求:有些基础类型的遍历,值希望它被赋予指定的几个值,赋予其他值能够别编译器(IDEA/eclipse)提醒 Android studu结合自己的插件,引入 <!-- https://mvnre ...

  7. 【STM32H7教程】第51章 STM32H7的LTDC应用之LCD汉字显示和2D图形显示

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第51章       STM32H7的LTDC应用之LCD汉字 ...

  8. 14 SQLite数据库

    SQLite数据库SQLite 是一款轻型的数据库SQLite 的设计目标是嵌入式的SQLite 占用资源低SQL 指结构化查询语言SQL 使我们有能力访问数据库SQL 是一种 ANSI 的标准计算机 ...

  9. 五、React事件方法(自写一个方法(函数),然后用按钮onClick触发它、自写方法改变this指向3种写法、

    上接:https://www.cnblogs.com/chenxi188/p/11782349.html 项目目录: my-app/ README.md node_modules/ package.j ...

  10. yum 安装 Mysql error ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 开启远程连接 修改登入密码 忘记root密码 配置防火墙规则 随手mark

    yum 安装 MYsql:        yum install mysql mysql-server mysql-devel -y 1.1 登入报错: ERROR 1045 (28000): Acc ...