【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等语法相关。

阅读更多

初学Clojure—定义函数

严格来说,Lisp是一种多范式语言,不仅仅是函数式编程,也可面向对象,也可面向过程,但它的特性确实在函数式编程中更为出色些。Clojure作为Lisp家族中的一员,继承祖先的优良传统,也有自己的特色,特别在“函数是第一公民”的原则上。比如匿名函数的递归,在Common Lisp只能自定义宏实现,在Scheme优雅不少,但也好看不到哪去。

阅读更多

初学Clojure—基本语法

为了全面学习函数式编程语言,之前尝试了scala,不得不承认它的入门门槛略高。于是乎,决定从古老的新语言Clorue入手,作为Lisp的一种方言,语法上无疑是古老的,但它又运行在JVM上且有一些不错的机制,无疑是门新语言。

阅读更多

LinkedIn的Parseq + ning.httpclient异步请求框架的使用

Parseq是Linkedin的一个异步框架,目前来说是个封装的较好而且易用的异步框架。除了普通的数据处理外,还支持网络请求、消息队列等。

阅读更多