JCTools简介-增强的并发工具
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简介-增强的并发工具相关推荐
- Java:计算机编程语言Java的简介、编程环境/工具、如何学习Java之详细攻略
Java:计算机编程语言Java的简介.编程环境/工具.如何学习Java之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编程Java语言→定义Java类→Java虚拟机 ...
- 【netty】Netty并发工具-Promise
1.概述 转载并且补充:从源码上理解Netty并发工具-Promise 2.前提 最近一直在看Netty相关的内容,也在编写一个轻量级的RPC框架来练手,途中发现了Netty的源码有很多亮点,某些实现 ...
- 死磕Java并发:J.U.C之并发工具类:Exchanger
作者:chenssy 来源:Java技术驿站 前面三篇博客分别介绍了CyclicBarrier.CountDownLatch.Semaphore,现在介绍并发工具类中的最后一个Exchange.Exc ...
- 死磕Java并发:J.U.C之并发工具类:CountDownLatch
作者:chenssy 来源:Java技术驿站 在上篇博客中介绍了Java四大并发工具一直的CyclicBarrier,今天要介绍的CountDownLatch与CyclicBarrier有点儿相似. ...
- 并发工具类(二)同步屏障CyclicBarrier
前言 JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...
- 并发工具类(四)两个线程进行数据交换的Exchanger
简介 Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法 ...
- 并发工具类(一)等待多线程完成的CountDownLatch
简介 CountDownLatch 允许一个或多个线程等待其他线程完成操作. 应用场景 假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个s ...
- 并发工具类(四)线程间的交换数据 Exchanger
前言 JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...
- 玩转java并发工具_玩Java并发
玩转java并发工具 最近,我需要将一些文件(每个文件都有JSON格式的对象列表(数组))转换为每个文件都具有相同数据(对象)的分隔行的文件. 这是一次性的任务,很简单. 我使用Java nio的某些 ...
- 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)
文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...
最新文章
- 2018年机器视觉前景预测
- python【力扣LeetCode算法题库】136-只出现一次的数字
- 【运筹学】表上作业法 ( 找初始基可行解 | 计算检验数 | 调整运量 )
- 关于面向对象的的设计原则的使用
- FileFilter过滤器的原理和使用
- 办公自动化-ppt的创建实操-各个对象的理解-0223
- java569_java如何实现这样一个程序
- 案例分享丨红外自动感应门设计与实现详解
- 2022年顺顺顺,送3本技术好书借你千里风
- 冰兮坊Java_java 中文字符 获取首字母(一级二级字符)
- rpm升级linux内核,用rpm方式升级RHEL6.1内核
- 使用USB直接方式解决ESXi识别加密狗的问题
- 谷链——国内首个可落地的农产品溯源
- INVENTOR结构件生成器,新建型材
- 信息系统项目管理师进度管理论文范例
- Tensorflow入门(一)----”搭建图像识别系统“教程整理
- c语言水仙花数作业,c语言水仙花数(c语言水仙花数的编程)
- python爬虫:模拟有道词典翻译文本
- 资金安全责任险对个人账户负责?
- 中国无叶片安全风扇市场趋势报告、技术动态创新及市场预测
热门文章
- 25. Location hash 属性
- 【linux】【git】git报错fatal: HTTP request failed
- PHP学习记录(一)
- iOS开发中常用的宏
- C语言中函数中传入一个数组,并且返回一个数组
- Python2.X和Python3.X文件对话框、下拉列表的不同
- [高中作文赏析]渴望从前
- 通过debug过程分析Struts2什么时候将Action对象放入了值栈ValueStack中
- 从宠物浴液做一个O2​O项目的设想
- C++ 调用批处理命令或者.bat(.cmd)文件或者.exe文件