- 博客(86)
- 收藏
- 关注
原创 spring4-3 适配jdk8的CompletableFuture
1.DeferredResultMethodReturnValueHandler旧版本(spring4.1.6)@Override public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { if (returnValue
2022-05-20 17:28:32 295
原创 java future专题 3-1 CompletableFuture和Listenablefuture的转换
1.背景在一些情况下,我们会遇到listenablefuture和CompletableFuture之间的转换。比如:场景1:将listenablefuture转为CompletableFuture你的代码依赖一个jar包,这个jar包的一个方法返回了一个listenablefuture,但是升级jdk7之后,你自己的代码逻辑想使用CompletableFuture来进行流程处理,但是你又没法改这个jar包,这个时候就需要将listenablefuture转为CompletableFuture来
2021-04-14 16:32:27 1619
原创 java future专题 2-5 CompletableFuture源码探秘-高级用法(2)
本篇继续介绍CompletableFuture的高阶使用方式。1.举例1)supplyAsync配合allOfCompletableFuture的supplyAsync配合allOf,将所有的future绑定到一起,然后所有都执行完之后触发对应操作,demo:allOf方法内部调用了andTree方法,看方法注释,该方法会根据传入的参数递归生成一棵树这段代码可能看起来有点绕,我们举个具体的例子,比如添加5个任务,那么cfs是个size为5的数组,lo是0,hi是4,根据这组参数,
2021-04-08 17:50:35 395
原创 java future专题 2-4 CompletableFuture源码探秘-高级用法(1)
前几篇介绍了CompletableFuture的最简单的使用方式。本篇介绍几种更高阶的使用方式。1.举例首先上个最简单的例子:1)supplyAsync配合thenCombineCompletableFuture的supplyAsync配合thenCombine方法,在通过supplyAsync拿到结果之后,结合另一个future,然后将两个结果都拿到然后做操作:因为supplyAsync在之前的文章中已经提到了,这里只说thenCombine。thenCombine方法中会调用bi
2021-04-06 17:51:46 291
原创 java future专题 2-2 CompletableFuture源码探秘-基础用法(2)
上篇https://blog.csdn.net/xxcupid/article/details/115375063,介绍了CompletableFuture的最简单的使用方式,是thenRun/thenRunAsync结合complete的方式使用。本篇仍是基础使用方法介绍,再举例几种简单使用方式。1.举例首先上个最简单的例子:1)thenRun配合completeCompletableFuture配合thenRun和complete方法,通过complete触发thenRun。demo样例
2021-04-01 20:44:09 232
原创 ThreadLocal详解(一)ThreadLocal和InheritableThreadLocal
ThreadLocal是java中很重要的一个类,可以在线程中传递值,虽然经常出现一些ThreadLocal误用的场景。本篇章会由浅入深,从普通的ThreadLocal和InheritableThreadLocal,到netty封装的FastThreadLocal,再到阿里封装的TransmittableThreadLocal,看下ThreadLocal以及其周边增强类的演化进程,所以计划会有三篇文章:ThreadLocal详解(一)ThreadLocal和InheritableThreadLoca
2021-03-01 16:09:38 228
原创 jvm sandbox 2020 3-3 repeater的qunar实践
上一篇中提到了jvm-sandbox-repeater实践过程的一些经验。这里面再讨论下可能遇到的问题。1、线上流量采样,采样出来的数据分布是什么样的,有没有代表性2、diff 降噪,降噪过滤掉的数据是不是不重要的,不需要关心的,降噪算法是否可靠1.酷家乐实践酷家乐利用jvm-sandbox-repeater结合自己公司内部的系统以及中间件,进行了定制化的二次开发,具体参考,ppt:https://tool.lu/index.php/en_US/deck/qj/detail?slide=8,视
2021-02-25 13:32:52 342
原创 Netty第二章 2020 7-2——Netty在Dubbo中的应用(1)Consumer端
DubboInvoker中的Exchange currentClientDubboProtocol中getClients,initClient会Exchangers的connectHeaderExchanger的connectHeaderExchangeHandler的received的handleResponseAbstractPeer
2020-08-25 18:35:26 124
原创 Netty第二章 2020 3-9 Netty源码之flush优化
1.Netty的flush优化handler——FlushConsolidationHandlerNetty的实现更复杂一些,对于用单独线程池处理业务的场景,有一些特殊的处理和优化,比如如果异步处理的时候,即channelReadComplete比channelRead结束的要早,所以在flush调用的时候,readInProgress已经是false了,然后根据用户决定是否开...
2020-04-30 17:13:54 1364
原创 Netty第二章 2020 3-8——Netty源码之Context,Channel,Pipeline,EventLoop,Handler,Selector
在看Netty源码的时候,我们经常会看到Context,Channel,Pipeline,EventLoop,Handler,Selector这些东西,尤其在debug的时候,经常会被这些概念弄得晕头转向,比方说:pipeline中有context,context中又有handler,context中又有channel,channel中又有pipeline,NioEventLoop中有sele...
2020-04-29 20:38:29 374
原创 Guava1.0—— 目录
1.Future的异常拆解https://blog.csdn.net/xxcupid/article/details/504922222.RemoveListener分析https://blog.csdn.net/xxcupid/article/details/504922213.loadingCache的同步/异步loadhttps://blog.csdn.net/xxcup...
2020-04-01 14:13:22 155
原创 Netty第二章 2020 3-3——Netty源码之Server端Worker线程组的启动
Server和Client端的交互上文提到了,NioEventLoop中有两个重要的操作,分别是NioEventLoop.processSelectedKeys和SingleThreadEventExecutor.runAllTasks。说完了runAllTasks,下面说下processSelectedKeys。当client端发起连接的时候:run:408, NioEventLoo...
2020-03-13 15:27:33 348
原创 Netty第二章 2020 3-2——Netty源码之Server端Boss线程组的启动
1.Server端启动以主从Reactor为例,Server在启动的时候,会创建Boss和Worker两个EventLoopGroup,这两个group会作为参数传入到ServerBootstrap的group方法中。Boss组线程的启动:AbsttractBootstrap.bind->绑定端口AbsttractBootstrap.initAndRegister->初...
2020-03-12 14:06:20 497
原创 Netty第二章 2020 3-1——Netty源码之Reactor模型部分
Reactor的单线程和多线程关于Reactor有一些地方想做下说明,因为看到网上说到这块内容的文章不是特别多,而提到这块的文章的一些用词可能会对一些同对Netty不是特别了解,或者正在学习Netty源码的同学造成一定困扰和误解,所以想在这里分享出来。这里有些理解可能和一些同学平时的认知不太相同。1.关于线程数NioEventLoopGroup有多个构造方法,也有无参构造方法,。无...
2020-03-10 21:06:41 252
原创 Guava1.3——Guava Cache进阶之同步/异步load
本文基于的guava版本是19.0一.同步load1.load和reloadload是第一次加载,加载之前cache中没有值,reload是之前cache中有值,需要刷新该值。2.refresh手动调用了refresh,会导致loadingcache的重新load操作。调用的是Segment中的refresh方法,里面有loadAsync方法,LoadingValueRefer...
2019-06-19 16:15:03 8812 2
原创 Disruptor 1 内部运转流程
1.Disruptor的构造和初始化可以调用Disruptor的构造函数初始化,可以设定线程池,等待策略,ringBuffer的大小等信息。注意,在高版本的Disruptor中,带线程池的构造方法已经被打上了Deprecated标记,原文是这样解释的:使用ThreadFactory来代替Executor的原因是为了能够在无法继续创建线程来执行producer任务的时候能够报告err...
2019-04-09 11:29:41 435
原创 Disruptor 0.1 相关知识及预热
1.Disruptor为什么快http://ifeve.com/locks-are-bad/2.关于synchronized关键字因为Java虚拟机的优化,现在synchronized已经没有之前想象的那么慢了。具体参见:http://ifeve.com/java-synchronized/在Disruptor为什么快的问题上,博客里指出了一个实验,即“Disruptor论文中...
2019-03-28 21:02:08 145
原创 Redisson(4)分布式锁之RedLock
Redis实现分布式锁的官方文档介绍Redis的官方文档对用Redis分布式锁的难点以及解决方案的考虑做了一些说明,具体内容参见:https://redis.io/topics/distlock,译文参考:http://ifeve.com/redis-lock/场景一:保存锁的Redis的master节点挂了。这里不是说有slave就没问题了,因为Redis的数据复制功能(replic...
2019-03-15 15:12:10 1767
原创 Redisson(3)CountDownLatch实现对比 VS Java的CountDownLatch
JDK的CountDownLatch的设计思路和锁类似,Java实现CountDownLatch的时候也利用了一个叫做AQS的东西,源码参照java.util.concurrent.locks.AbstractQueuedSynchronizer。这个类的其中一个思想核心是内部的一个state状态变量,这个状态会告诉你当前的锁是否可用,当前的latch是否倒计时结束等等。核心接口连个方...
2019-03-14 10:49:35 2183
原创 Redisson(2-3)分布式锁实现对比 VS Java的ReentrantLock的FairLock
Redisson实现了一整套JDK中ReentrantLock的功能,这里对比一下公平锁(Fair)实现的差异和核心的思想。公平锁存在的意义是为了保证绝对的公平,但是有其弊端,这个在网上有很多相关的解释,就是说绝对的公平不一定是性能最高的,因此和它相对的还有非公平锁,但是费公平锁也有问题,会引发饥饿现象。具体解释也可参见https://blog.csdn.net/xxcupid/article...
2019-03-11 11:33:01 1258
原创 Redisson(2-2)分布式锁实现对比 VS Java的ReentrantLock之带超时时间的tryLock
Redisson实现了一整套JDK中ReentrantLock的功能,这里对比一下实现的差异和核心的思想。unfair模式的带超时时间的tryLock(超时时间)ReentrantLock这里上来会直接先试下能不能try成功,如果不成功,进入等待并开始竞争等逻辑。整个锁的核心是通过LockSupport的park方法来实现的,这是调用底层UNSAFE的park方法来实现...
2019-03-06 17:08:07 2291
原创 Redisson(2-1)分布式锁实现对比 VS Java的ReentrantLock之tryLock
Redisson实现了一整套JDK中ReentrantLock的功能,这里对比一下实现的差异和核心的思想。unfair模式的tryLockReentrantLock①判断当前的state是否是0(初始状态),并用原子操作设置state,成功说明获取锁,并把当前线程设置为获取锁的线程。②如果state不是0,检查当前线程是否是持有锁的线程,如果是就按照重入语义,增加计数,当然...
2019-03-05 15:43:45 3289
原创 Redisson(1)分布式锁——如何解决死锁问题
Redisson是如何解决死锁问题的?普通利用Redis实现分布式锁的时候,我们可能会为某个锁指定某个key,当线程获取锁并执行完业务逻辑代码的时候,将该锁对应的key删除掉来释放锁。lock->set(key),成功->执行业务,业务执行完毕->unlock->del(key)。根据这种操作和实践方式,我们可以分为下面两个场景:1)业务机器宕机因为我们...
2019-03-04 16:13:16 19008 13
原创 ThreadPoolExecutor(六)——线程池关闭之后
上一篇主要从代码角度介绍了线程池关闭相关的方法,包括各个方法之间的逻辑关系,调用关系和产生的效果。这一篇更多从逻辑角度上来说一下线程池在shutdown之后,原来正常的处理流程有哪些变化,既是总结也是扩展。shutdown操作之后,首先最重要的一点变化就是线程池状态变成了SHUTDOWN。该状态是开始关闭线程池之后,从RUNNING改变状态经过的第一个状态(还有一种情况是直接进STOP,调
2016-07-22 18:09:46 9389
原创 ThreadPoolExecutor(五)——线程池关闭相关操作
补充了和Thread的interrupt操作相关的知识,回头再来看ThreadPoolExecutor中interrupt,关闭线程池等相关操作。1.interruptIdleWorkers/** * Interrupts threads that might be waiting for tasks (as * indicated by not being locke
2016-07-22 11:49:47 33043
原创 ThreadPoolExecutor(三)——Worker
1.WorkerWorker是ThreadPoolExecutor的一个内部类,实现了AbstractQueuedSynchronizer抽象类。/** * Class Worker mainly maintains interrupt control state for * threads running tasks, along with other minor b
2016-07-21 16:02:44 4416
原创 ThreadPoolExecutor(二)——execute
1.execute方法/** * Executes the given task sometime in the future. The task * may execute in a new thread or in an existing pooled thread. * * If the task cannot be submitted for
2016-07-21 11:51:32 985
原创 ThreadPoolExecutor(一)——简介
ThreadPoolExecutor初始化一个ThreadPoolExecutor从初始化到执行需要经历如下几个环节。ThreadPoolExecutor.executeThreadPoolExecutor.addWorkernew Worker(firstTask)getThreadFactory().newThread(this)new Thread(ThreadGro
2016-07-21 11:35:29 507
原创 log(五)——MDC总结
1.为什么最开始子线程会得到父线程MDC设置的内容?创建子线程的时候会调用init(ThreadGroup g, Runnable target, String name,long stackSize)方法,判断如果parent.inheritableThreadLocals不为null就调用createInheritedMap方法把父线程的ThreadLocal里保存的变量都加载到子线程的T
2016-07-21 11:27:47 6845
原创 log(四)——MDC使用
1.MDC put用MDC的put方法,把需要的context添加到当前线程的context map中。之前说过,子线程在创建的时候会把父线程中的inheritableThreadLocals变量设置到子线程的inheritableThreadLocals中,而MDC内部是用InheritableThreadLocal实现的,所以自然会把父线程中的上下文带到子线程中。2.getCopy
2016-07-20 11:50:48 9366 1
原创 log(三)——MDCAdapter之实现LogbackMDCAdapter
1.put/** * Put a context value (the val parameter) as identified with the * key parameter into the current thread's context map. Note that * contrary to log4j, the val parameter can be nu
2016-07-19 20:40:54 4376 1
原创 log(二)——MDC实现之ThreadLocal
因为MDC底层是用ThreadLocal实现的,所以这里补充一些和ThreadLocal相关的知识点。1.ThreadLocal的三个层次关于ThreadLocal有三个层次,可以按照这三个层次去理解就不会乱。三个层次 * 第一层是Thread空间 * 第二层是Thread中的两个ThreadLocalMap,threadLocals和inheritableThreadLoca
2016-07-19 17:12:54 3126 1
原创 log(一)——MDC入门
1.MDC是什么先来一段原版注释,/** * This class hides and serves as a substitute for the underlying logging * system's MDC implementation. * * * If the underlying logging system offers MDC functionality,
2016-07-19 14:31:42 7078
原创 pool(六)——JedisPool
本文剖析redis.clients.jedis中关于jedis连接池部分的源码。因为只涉及连接池的部分思想,不设计具体jedis底层创建连接部分,所以篇幅很小。1.Pool和上一篇数据库连接池的PoolingDataSource一样,这个Pool类包装了对象池,里面存放了一个GenericObjectPool类型的internalPool变量。2.JedisFactory和jedi
2016-07-19 11:40:40 242
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人