- 浏览: 498585 次
- 性别:
- 来自: 上海
最新评论
-
abc08010051:
张延龙地盘 写道多实例下就不行了吧是的,多实例直接上分布式锁
java高并发下的唯一性验证 -
张延龙地盘:
多实例下就不行了吧
java高并发下的唯一性验证 -
a12345531:
s3.getResourceUrl(bucketName, k ...
Amazon AWS S3 上传文件 并获取公用url -
544483342:
楼主请问WorkerEventHandler和EventHan ...
disruptor(一) 单一生产者和WorkPool消费者源码阅读 -
544483342:
请问楼主使用的是什么UML工具啊?
disruptor(一) 单一生产者和WorkPool消费者源码阅读
文章列表
最近项目中有用到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 ...
CompletableFuture源码赏析
- 博客分类:
- java se
文章原创,转载请注明出处: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 ...
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环境下打不出日志