JCTools简介

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 call
    h ^= (h>>>20) ^ (h>>>12);
    h ^= (h>>> 7) ^ (h>>> 4);
    h += h<<7; // smear low bits up high, for hashcodes that only differ by 1
    return h;
  }

改为

// --- hash ----------------------------------------------------------------
  // Helper function to spread lousy hashCodes
  private 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;
  }

doc

  • JCTools
  • Java Concurrent Counters By Numbers
  • Lock Free Queues Index
  • 135 Million messages a second between processes in pure Java

本文分享自微信公众号 - 码匠的流水账(geek_luandun)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-09-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 聊聊HystrixEventStream

    hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/metric/HystrixEventStream.j...

    codecraft
  • 聊聊hikari连接池的isAllowPoolSuspension

    本文主要研究一下hikari连接池的isAllowPoolSuspension属性

    codecraft
  • 聊聊elasticsearch的SeedHostsResolver

    elasticsearch-7.0.0/server/src/main/java/org/elasticsearch/discovery/PeerFinder....

    codecraft
  • 指纹识别传感器市场仍将持续上涨

    市场分析公司MarketsandMarkets的一份研究报告称,未来几年指纹识别传感器市场整体仍将呈上涨趋势。

    人工智能快报
  • Java 类机制(1)---- 初识 Class

    回想起我刚刚接触 Java 的时候,对它的反射机制很是好奇,因为通过它可以访问一些类中的非 public 的属性和方法,当时觉得这真是一个非常厉害的黑科技啊,...

    指点
  • 腾讯云直播答题方案解析

    基于腾讯云业界领先的视频云技术,提供一站式在线知识竞技接入方案,并独家提供微信小程序接入方案。

    腾讯视频云
  • 进程和线程

    今天写这两篇文章,技术含量不高,主要是分享一下自己很不容易理解的几个概念。因为最近在开发中接触到这一块,后期对这方便有深入了解会对这方面做一个深入的讲解。

    A梦多啦A
  • 当JS对象属性点后面的属性想用变量表示时代码该如何写

    lilugirl
  • Android JNI 开发

    几乎稍有经验的Android开发,都会在工作中用到JNI的开发。即使工作中没有涉及到JNI的开发,在我们使用第三方的库时,也经常需要引入.so文件。

    Oceanlong
  • 在Struts2 Action中快速简便的访问Request、Session等变量

    全部方法(共四种)可以参考:http://blog.csdn.net/itmyhome1990/article/details/7019476

    Rekent

扫码关注云+社区

领取腾讯云代金券