【Spring源码分析】BeanFactory体系的作用

最近静下心开始研读spring源码,从容器开始,直入眼帘的就是BeanFactory这个终极boss。通过BeanFactory及其子接口能得知不同的注入方式与获取方式,在尝试拓展自己的实例化时,有必要的用处。

阅读更多

【Dubbo源码分析】四种负载均衡

Dubbo选择在客户端做负载均衡,提供了四种选择:随机、轮询、最少活跃调用数、一致性Hash。四种算法简单且有趣,可以稍微研究以下。

阅读更多

【Dubbo源码分析】SPI机制,将URL与可插拔拓展融合到极致

开始啃Dubbo时候,对其功能多样被吓到,若干功能由xml配置可任意组装,担心其复杂度过高,源码难啃。当我开始啃启动步骤的代码后,发现ExtensionLoader经常出现在较重要实例化的地方。
是的,ExtensionLoader、@SPI、@Adaptive、@Activate可以说是Dubbo的核心,Cluster、Protocol、Filter等接口都被声明为SPI,什么作用呢?能根据配置动态调用被声明为SPI接口的实现类,dubbo提供了URL方式作为参数配置。

阅读更多

【Java并发】JUC—ReentrantReadWriteLock有坑,小心读锁!

好长一段时间前,某些场景需要JUC的读写锁,但在某个时刻内读写线程都报超时预警(长时间无响应),看起来像是锁竞争过程中出现死锁(我猜)。经过排查项目并没有能造成死锁的可疑之处,因为业务代码并不复杂(仅仅是一个计算过程),经几番折腾,把注意力转移到JDK源码,正文详细说下ReentrantReadWriteLock的隐藏坑点。

阅读更多

【Java并发】JUC.lock包AbstractQueuedSynchronizer的源码分析(一)

平时开发不少使用synchronized,java提供了这个语法特性使用起来非常方便,但灵活性似乎不太好,因为它只是个独占且可重入锁,无法唤醒指定线程和实现共享等其他类型锁。

阅读更多

asynchttpclient源码分析-基于Netty的连接池实现

最近项目重构,有了个机会更多接触一个有别于HttpAsyncClient的异步网络框架AsyncHttpClient,是个基于Netty的支持Http(s)或WebSocket协议的客户端。这东西有很多有趣的地方,特别是连接池的实现简单易懂,没有apache.hc的连接池实现那么蛋疼。如果想深入了解Netty用法的话,这是个不错的案例,很值得深究!

阅读更多

初学Clojure—不可变性与惰性

在前面有简易说到不可变性是咋回事,这里要稍微理性一些认识不可变性中结构化共享的概念。结构化共享可以使数据结构少占内存,clojure还提供了更节省内存的方法—惰性。

阅读更多

初学Clojure—集合与数据结构

这个很重要,不需要多说,clojure提供了vector、list、queue、set、map这几种数据结构,来看看它们的基本操作。

阅读更多

初学Clojure—函数与高阶函数

本来这应该放在递归之前的,不过没什么影响,反而对闭包的理解有帮助。把函数作为第一等公民的clojure,自然会给函数提供吊炸天的功能,使其变得吊炸天,写出更吊炸天的闭包!例如串行调用的组合函数、偏函数和柯里化、以及高阶函数等等。

阅读更多

初学Clojure—循环与尾递归

Lisp语言中,循环不像Java提供forwhile等语法,经典用法还是使用递归,clojure也有提供loop循环。在clojure中,递归、循环息息相关的工具recur,它的存在跟clojure实现在jvm之上有所关系,其原因也跟Java为什么有forwhile等语法相关。

阅读更多