`
文章列表
 最近项目中有用到disruptor,提供一个类似队列或者数据容器的功能,并发能力很强   概念: Sequence:就是一个增长序列,类似oracle的增长序列,生产和消费程序都有Sequence,记录生产和消费程序的序列 Sequencer: 多个概念的一个组合,持有Sequence,等待策略等一些引用,生产者引用 SequenceBarrier:直接翻译就是序列屏障,就是Sequence和RingBuffer交互的一个屏障,单个生产者时,生产者不需要SequenceBarrier RingBuffer:是一个数组,根据追踪生产和消费的Sequence来实现一个环形的数据结构 ...
package com.ctrip.framework.apollo.demo; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @author maxiaolong * @create 2018-07-17 10:12 **/ public class StreamDemo ...
文章原创,转载请注明出处:http://abc08010051.iteye.com/blog/2409693 后面会再修改一下,让文章读起来更好读,现在的版本还比较粗糙     CompletableFuture是java 1.8提供的一个新类,是对Future的增强,吸收了guava异步线程的特点,可以实现一系列的异步线程操作,很多常规的用法网上有很多博客,这里说说部分代码的实现:    这是CompletableFuture的基本结构   CompletableFuture基本属性方法 volatile Object result; // Eithe ...
1 spring 事件机制的好处:解耦合,对于一对多的操作,可以接触代码耦合   2 针对于要解耦的操作,很多都可以异步操作,主线程响应时间会变快,spring提供的事件机制默认是同步的,   @Override public void multicastEvent(final ApplicationEvent event, ResolvableType eventType) { ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event)); for (fi ...
java 8 Function特性也出现了很久了,在项目用的越来越多,记录一下个人的感悟   1 函数式参数的编程思想,对callback功能的全面替代     这个很容易理解,callback本身就是接近函数式参数的一个概念,代码封装中常会对同一个方法中相同的部分抽取,不同的部分定义成callback,调用者提供具体的实现,使用过的类HibernateDaoSupport是一个很好的体现,使用Function,Consumer可以做完美的替代,下面是我们针对幂等操作(分布式锁提供锁支持)的一个封装     /** * 分布式锁支持,获取不到锁抛出Idempo ...
curator版本: <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>2.5.0</version> </dependency>     代码实现   private boolean internalLock(long ...
关于把list转换成key value的map有很多博客上都有实现,这里是一个吧value放入到集合中去   List<String> list = Lists.newArrayList("1", "2", "3", "1"); Map<String, List<String>> map = list.stream().collect(Collectors.toMap(key -> key, value ...
注: 下面的源码理解均基于jdk1.8的源码      HashMap是常用的数据集合,但是是无序, LinkedHashMap就是在HashMap上进行的一种扩展,在HashMap特性的基础上增加了有序这个特性(还可以根据最新使用自动排序)设计十分巧妙      1 LinkedHashMap继承自HashMap      public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> {    2 LinkedHashMap 每个节点 ...
spring boot 提供了统一的异常处理机制,@ControllerAdvice, @ExceptionHandler两个注解,可以处理controller里抛出的异常,不要对每个controller方法进行try catch,如果你使用json或者返回固定的错误页面作为传输数据格式,普通的使用方法即可解决,由于我们服务端使用protobuf与客户端进行交互,每个controller方法的返回类型的泛型都是不固定的,于是做了一定的扩展,以适应每个controller的返回:   /** * 全局异常处理 * Created by mxl on 2016/9/2. */ ...

泛型的使用

public class ClassTest { public static void main(String[] args) throws Exception { ParameterizedType type = (ParameterizedType) Bar.class.getGenericSuperclass(); System.out.println(type.getActualTypeArguments()[0]); ParameterizedType fieldType = (ParameterizedType) ...
  disruptor部分代码流程控制使用的是异常,抛出自定义的异常,外层捕捉,下面是它封装的异常   直接贴代码: public final class AlertException extends Exception { /** * Pre-allocated exception to avoid garbage generation */ public static final AlertException INSTANCE = new AlertException(); /** * Private con ...
    在《disruptor(一) 单一生产者和WorkPool消费者源码阅读》介绍了单一生产者   当多个生产者向RingBuffer中写入数据时,创建Disruptor时要修改对应的参数:   Disruptor disruptor = new Disruptor(eventFactory, BUFFER_SIZE, executor, ProducerType.MULTI, new YieldingWaitStrategy ());  ProducerType.MULTI 使用这个参数,单一生产者时,Sequencer接口的实现是Sing ...

java akka

1 需要的依赖 <dependency> <groupId>com.typesafe.akka</groupId> <artifactId>akka</artifactId> <version>2.1.4</version> </dependency> <dependency> <groupId>com.typesafe.akka</groupId> <artifactId>akka-actor ...
logback 多线程下频繁的写日志会出现死锁,可以使用异步appender避免这个问题: <!-- 异步写日志,用户简介专用日志 --> <appender name="ASYNC_USER_PROFILE_MODEL" class="ch.qos.logback.classic.AsyncAppender"> <File>${LOG_HOME}/userprofilemodel.log</File> <Encoding>UTF-8</Encoding&g ...
logback的jar包和slf4j-log4j12.jar包在linux环境下冲突,windows下正常; hadoop的jar包会下载其依赖的jar包slf4j-log4j12.jar;同时使用logback和hadoop操作,要在pom中exclusion slf4j-log4j12.jar;否则在linux环境下打不出日志
Global site tag (gtag.js) - Google Analytics