Disruptor

Java 并发实践 — ConcurrentHashMap 与 CAS

流过昼夜 提交于 2019-11-28 19:22:51
最近在做接口限流时涉及到了一个有意思问题,牵扯出了关于concurrentHashMap的一些用法,以及CAS的一些概念。限流算法很多,我主要就以最简单的计数器法来做引。先抽象化一下需求:统计每个接口访问的次数。一个接口对应一个url,也就是一个字符串,每调用一次对其进行加一处理。可能出现的问题主要有三个: 多线程访问,需要选择合适的并发容器 分布式下多个实例统计接口流量需要共享内存 流量统计应该尽可能不损耗服务器性能 但这次的博客并不是想描述怎么去实现接口限流,而是主要想描述一下遇到的问题,所以,第二点暂时不考虑,即不使用Redis。 说到并发的字符串统计,立即让人联想到的数据结构便是ConcurrentHashpMap<String,Long> urlCounter; 如果你刚刚接触并发可能会写出如代码清单1的代码 代码清单1: public class CounterDemo1 { private final Map<String, Long> urlCounter = new ConcurrentHashMap<>(); //接口调用次数+1 public long increase(String url) { Long oldValue = urlCounter.get(url); Long newValue = (oldValue == null) ? 1L :

Disruptor (4)

江枫思渺然 提交于 2019-11-28 17:04:54
Disruptor.shutdown 方法阻塞至所有事件得到处理。 循环调用hasBacklog()判定当前 生产分配的游标: ringBuffer.getCursor() > 消费者序号: consumer的lastSequence,表示还未处理完结。 public void shutdown(final long timeout, final TimeUnit timeUnit) throws TimeoutException { final long timeOutAt = System.currentTimeMillis() + timeUnit.toMillis(timeout); while (hasBacklog()) { if (timeout >= 0 && System.currentTimeMillis() > timeOutAt) { throw TimeoutException.INSTANCE; } // Busy spin try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } halt(); } private boolean hasBacklog() { final

Disruptor (4)

一世执手 提交于 2019-11-28 16:56:23
Disruptor.shutdown 方法阻塞至所有事件得到处理。 循环调用hasBacklog()判定当前 生产分配的游标: ringBuffer.getCursor() > 消费者序号: consumer的lastSequence,表示还未处理完结。 public void shutdown(final long timeout, final TimeUnit timeUnit) throws TimeoutException { final long timeOutAt = System.currentTimeMillis() + timeUnit.toMillis(timeout); while (hasBacklog()) { if (timeout >= 0 && System.currentTimeMillis() > timeOutAt) { throw TimeoutException.INSTANCE; } // Busy spin try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } halt(); } private boolean hasBacklog() { final

开源工具整理(持续更新)

爱⌒轻易说出口 提交于 2019-11-27 16:45:04
工具类 CAL10N 国际化工具 参考 http://cal10n.qos.ch/ joda-time Joda 实际上是涵盖众多用于 Java 语言的替代 API 的大型项目,因此从技术上讲,使用 Joda 和 Joda-Time 名称表示相同的意思是一种误称。 Joda Time,一个面向 Java™ 平台的易于使用的开源时间/日期库。正如您在本文中了解的那样,Joda-Time 轻松化解了处理日期和时间的痛苦和繁琐。 参考资料 官网 Joda-Time 简介 HanLP HanLP是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。 HanLP 提供下列功能: 中文分词 最短路分词 N-最短路分词 CRF分词 索引分词 极速词典分词 用户自定义词典 词性标注 命名实体识别 中国人名识别 音译人名识别 日本人名识别 地名识别 实体机构名识别 关键词提取 TextRank关键词提取 自动摘要 TextRank自动摘要 短语提取 基于互信息和左右信息熵的短语提取 拼音转换 多音字 声母 韵母 声调 简繁转换 繁体中文分词 简繁分歧词(简体、繁体、臺灣正體、香港繁體) 文本推荐 语义推荐 拼音推荐 字词推荐 依存句法分析 基于神经网络的高性能依存句法分析器 MaxEnt依存句法分析