JCTools

早在96年就有论文提出了无锁队列的概念,再到后来 Disruptor,高性能已得到生产的验证。此处介绍的 Jctools 中的高性能队列,其性能丝毫不输于 Disruptor。

JCTools (Java Concurrency Tools) 提供了一系列非阻塞并发数据结构(标准 Java 中缺失的),当存在线程争抢的时候,非阻塞并发数据结构比阻塞并发数据结构能提供更好的性能。

JCTools 是一个开源工具包,在 Apache License 2.0 下发布,并在 Netty、Rxjava 等诸多框架中被广泛使用。

JCTools 的开源 Github 仓库:https://github.com/JCTools/JCTools

在 Maven 中引入 JCtools jar 包就能使用 JCTools 了:

        <dependency><groupId>org.jctools</groupId><artifactId>jctools-core</artifactId><version>3.0.0</version></dependency>

JCTools 中主要提供了 Map 以及 Queue 的非阻塞并发数据结构:

非阻塞 Map

  • ConcurrentAutoTable(后面几个map/set结构的基础)
  • NonBlockingHashMap
  • NonBlockingHashMapLong
  • NonBlockingHashSet
  • NonBlockingIdentityHashMap
  • NonBlockingSetInt

NonBlockingHashMap 是对 ConcurrentHashMap 的增强,对多 CPU 的支持以及高并发更新提供更好的性能。

NonBlockingHashMapLong 是 key 为 Long 型的 NonBlockingHashMap。

NonBlockingHashSet 是对 NonBlockingHashMap 的简单包装以支持 set 的接口。

NonBlockingIdentityHashMap 是从 NonBlockingHashMap 改造来的,使用 System.identityHashCode() 来计算哈希。

NonBlockingSetInt 是一个使用 CAS 的简单的 bit-vector。

非阻塞 Queue

JCTools 提供的非阻塞队列分为 4 类,可以根据不同的应用场景选择使用:

  • SPSC-单一生产者单一消费者(有界和无界)
  • MPSC-多生产者单一消费者(有界和无界)
  • SPMC-单生产者多消费者(有界)
  • MPMC-多生产者多消费者(有界)

“生产者”和“消费者”是指“生产线程”和“消费线程”。

        // spsc-有界/无界队列Queue<String> spscArrayQueue = new SpscArrayQueue(16);Queue<String> spscUnboundedArrayQueue = new SpscUnboundedArrayQueue(2);// spmc-有界队列Queue<String> spmcArrayQueue = new SpmcArrayQueue<>(16);// mpsc-有界/无界队列Queue<String> mpscArrayQueue = new MpscArrayQueue<>(16);Queue<String> mpscChunkedArrayQueue = new MpscChunkedArrayQueue<>(1024, 8 * 1024);Queue<String> mpscUnboundedArrayQueue = new MpscUnboundedArrayQueue<>(2);// mpmc-有界队列Queue<String> mpmcArrayQueue = new MpmcArrayQueue<>(16);

JCTools是一款对jdk并发数据结构进行增强的并发工具,主要提供了map以及queue的增强数据结构。原来netty还是自己写的MpscLinkedQueueNode,后来新版本就换成使用JCTools的并发队列了。

增强map

  • ConcurrentAutoTable(后面几个map/set结构的基础)
  • NonBlockingHashMap
  • NonBlockingHashMapLong
  • NonBlockingHashSet
  • NonBlockingIdentityHashMap
  • NonBlockingSetInt

增强队列

  • SPSC - Single Producer Single Consumer (Wait Free, bounded and unbounded)
  • MPSC - Multi Producer Single Consumer (Lock less, bounded and unbounded)
  • SPMC - Single Producer Multi Consumer (Lock less, bounded)
  • MPMC - Multi Producer Multi Consumer (Lock less, bounded)

maven

        <dependency><groupId>org.jctools</groupId><artifactId>jctools-core</artifactId><version>2.1.0</version></dependency>

ConcurrentAutoTable

替代AtomicLong,专门为高性能的counter设计的。只有几个方法

public void add( long x );
public void decrement();
public void increment();
public void set( long x );
public long get();
public int  intValue();
public long longValue();
public long estimate_get();

对比AtomicLong主要是操作之后没有立即返回

public final long incrementAndGet();
public final long decrementAndGet()

NonBlockingHashMap

NonBlockingHashMap是对ConcurrentHashMap的增强,对多CPU的支持以及高并发更新提供更好的性能。
NonBlockingHashMapLong是key为Long型的NonBlockingHashMap。
NonBlockingHashSet是对NonBlockingHashMap的简单包装以支持set的接口。
NonBlockingIdentityHashMap是从NonBlockingHashMap改造来的,使用System.identityHashCode()来计算哈希
NonBlockingSetInt是一个使用CAS的简单的bit-vector

原来是

// --- hash ----------------------------------------------------------------// Helper function to spread lousy hashCodes.  Throws NPE for null Key, on// purpose - as the first place to conveniently toss the required NPE for a// null Key.private static final int hash(final Object key) {int h = key.hashCode();     // The real hashCode callh ^= (h>>>20) ^ (h>>>12);h ^= (h>>> 7) ^ (h>>> 4);h += h<<7; // smear low bits up high, for hashcodes that only differ by 1return h;}

改为

// --- hash ----------------------------------------------------------------// Helper function to spread lousy hashCodesprivate static final int hash(final Object key) {int h = System.identityHashCode(key); // The real hashCode call// I assume that System.identityHashCode is well implemented with a good// spreader, and a second bit-spreader is redundant.//h ^= (h>>>20) ^ (h>>>12);//h ^= (h>>> 7) ^ (h>>> 4);return h;}

JCTools简介-增强的并发工具相关推荐

  1. Java:计算机编程语言Java的简介、编程环境/工具、如何学习Java之详细攻略

    Java:计算机编程语言Java的简介.编程环境/工具.如何学习Java之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编程Java语言→定义Java类→Java虚拟机 ...

  2. 【netty】Netty并发工具-Promise

    1.概述 转载并且补充:从源码上理解Netty并发工具-Promise 2.前提 最近一直在看Netty相关的内容,也在编写一个轻量级的RPC框架来练手,途中发现了Netty的源码有很多亮点,某些实现 ...

  3. 死磕Java并发:J.U.C之并发工具类:Exchanger

    作者:chenssy 来源:Java技术驿站 前面三篇博客分别介绍了CyclicBarrier.CountDownLatch.Semaphore,现在介绍并发工具类中的最后一个Exchange.Exc ...

  4. 死磕Java并发:J.U.C之并发工具类:CountDownLatch

    作者:chenssy 来源:Java技术驿站 在上篇博客中介绍了Java四大并发工具一直的CyclicBarrier,今天要介绍的CountDownLatch与CyclicBarrier有点儿相似. ...

  5. 并发工具类(二)同步屏障CyclicBarrier

    前言   JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...

  6. 并发工具类(四)两个线程进行数据交换的Exchanger

    简介 Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法 ...

  7. 并发工具类(一)等待多线程完成的CountDownLatch

    简介 CountDownLatch 允许一个或多个线程等待其他线程完成操作. 应用场景 假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个s ...

  8. 并发工具类(四)线程间的交换数据 Exchanger

    前言   JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...

  9. 玩转java并发工具_玩Java并发

    玩转java并发工具 最近,我需要将一些文件(每个文件都有JSON格式的对象列表(数组))转换为每个文件都具有相同数据(对象)的分隔行的文件. 这是一次性的任务,很简单. 我使用Java nio的某些 ...

  10. 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)

    文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...

最新文章

  1. 2018年机器视觉前景预测
  2. python【力扣LeetCode算法题库】136-只出现一次的数字
  3. 【运筹学】表上作业法 ( 找初始基可行解 | 计算检验数 | 调整运量 )
  4. 关于面向对象的的设计原则的使用
  5. FileFilter过滤器的原理和使用
  6. 办公自动化-ppt的创建实操-各个对象的理解-0223
  7. java569_java如何实现这样一个程序
  8. 案例分享丨红外自动感应门设计与实现详解
  9. 2022年顺顺顺,送3本技术好书借你千里风
  10. 冰兮坊Java_java 中文字符 获取首字母(一级二级字符)
  11. rpm升级linux内核,用rpm方式升级RHEL6.1内核
  12. 使用USB直接方式解决ESXi识别加密狗的问题
  13. 谷链——国内首个可落地的农产品溯源
  14. INVENTOR结构件生成器,新建型材
  15. 信息系统项目管理师进度管理论文范例
  16. Tensorflow入门(一)----”搭建图像识别系统“教程整理
  17. c语言水仙花数作业,c语言水仙花数(c语言水仙花数的编程)
  18. python爬虫:模拟有道词典翻译文本
  19. 资金安全责任险对个人账户负责?
  20. 中国无叶片安全风扇市场趋势报告、技术动态创新及市场预测

热门文章

  1. 25. Location hash 属性
  2. 【linux】【git】git报错fatal: HTTP request failed
  3. PHP学习记录(一)
  4. iOS开发中常用的宏
  5. C语言中函数中传入一个数组,并且返回一个数组
  6. Python2.X和Python3.X文件对话框、下拉列表的不同
  7. [高中作文赏析]渴望从前
  8. 通过debug过程分析Struts2什么时候将Action对象放入了值栈ValueStack中
  9. 从宠物浴液做一个O2​O项目的设想
  10. C++ 调用批处理命令或者.bat(.cmd)文件或者.exe文件