0%

了解到CompletableFuture的基础用法之后,我们不禁好奇,以前的Future模式不支持如此好用的异步编程,CompletableFuture是如何做到的呢?这就需要我们去阅读源码了,通过源码我们才能了解到其设计思想和实现方式,我们分析下supplyAsync 和 thenApplyAsync 这两个,并且是提供线程池的接口,因为如果不提供自定义线程池,就会用默认的,如下:

1
2
3
4
5
6
7
8
9
private static final boolean USE_COMMON_POOL =
(ForkJoinPool.getCommonPoolParallelism() > 1);

private static final Executor ASYNC_POOL = USE_COMMON_POOL ?
ForkJoinPool.commonPool() : new ThreadPerTaskExecutor();

static final class ThreadPerTaskExecutor implements Executor {
public void execute(Runnable r) { new Thread(r).start(); }
}
Read more »

最近一直在看Reactive相关的知识,周末刚好阿里巴巴举办了一个Reactive架构相关的技术分享会,周末没啥事就报名去了,地点在浦东张江人工智能岛,当时去了大概有一百多人,演讲嘉宾有阿里云原生平台技术专家Andy Shi,阿里P9雷卷Jacky和爱奇艺的一个开发者。 本来Josh Long也会来,但他父亲病危就没有来。

Read more »

最近看JDK11的CompletableFuture源码实现时,发现内部使用了Treiber stack,维基百科上作以下描述:

The Treiber stack algorithm is a scalable lock-free stack utilizing the fine-grained concurrency primitive compare-and-swap

Treiber stack算法是属于无锁并发栈,内部使用CAS(compare-and-swap)来实现无锁并发算法。关于CAS想必大家都很熟悉,至少会用。我们先来看看CompletableFuture的无锁并发栈的实现。

Read more »

上星期看了王宝强主演的一部电影,名字叫《Hello!树先生》。这部电影选材背景来自底层小人物,由王宝强刻画了一个颓废、压抑以及迷茫名叫树哥的年轻人。树哥没什么文化,当维修工修汽车的时候把眼睛闪住了,成了待业青年。由于村子附近开发煤矿,所以整个村子要搬迁,当然树哥的家也是要拆迁的,暂时还没有,街上不时有车在宣传拆迁补偿什么的,这种场景估计大家都有体会,毕竟近几年来国家高速发展,城镇化的步伐也越来越块。树哥家的地被二猪家的场子给占了去,树的老娘要求树去讨回公道,树的性格是那种随性的,估计他也不想那么随性,但没有硬气的资本,想硬也硬不起来。

Read more »

用过Spring推出的Reactor框架的同学可能会感叹异步编程的便利,不过Reactor对于异步编程的初学者来说有点复杂了,看其源码也不是那么容易,那么JDK有没有对异步编程相关的支持呢?Future想必大家都很熟悉(不了解的同学请查看Callable&Future及FutureTask实现分析(JDK11)),在线程池里面运行,返回Future,等待计算结果,虽然采用线程池来运行代码,但像Reactor那样链式编程是不容易的。因为Future的结果是需要调用者自己去拿的,计算没有结束就会一直被阻塞,试想下有没有这样一种设计呢?当计算完之后,主动将计算结果推给调用者。可能有人说,这个不是Callback模式吗?如下伪代码所示:

1
2
3
4
5
fn doFun(params, callback() {
doFun2(params, callback() {
...Callback Hell
})
})
Read more »

我们平时把开源代码托管在github上,当代码发展到某一程度,准备打个RELEASE包放到内网私有仓库或者Maven中央仓库,这时就需要用到Maven Release Plugin,这个插件专为打包准备的,我们要知道怎么集成到自己的项目中和正确打包。这里以将RELEASE包发布到阿里云云效私有仓库为例,记录下打包的流程。

Read more »

前段时间了解了WebFlux,该框架采用全新的Reactive技术栈,依赖Spring团队的Reactor框架。Reactive programming(响应式编程) 是一种比较新的编程模式,在维基百科中有如下定义:

Reactive programming is an asynchronous programming paradigm concerned with data streams and the propagation of change. This means that it becomes possible to express static (e.g. arrays) or dynamic (e.g. event emitters) data streams with ease via the employed programming language(s).

从上面的描述(感觉很空洞),我们可以知道响应式编程有两个要点:asynchronous(异步)data streams(数据流)。在JDK中引入Stream,让静止的数据强行流动,这个响应式编程也涉及到了Stream,这个词真是相当火爆,在Flink等大数据计算框架中无处不在,那么它与JDK中的Stream有没有关系呢?这里就要谈到了Reactive Streams规范。

Read more »

死锁在系统中可能出现的频率比较高,特别是在生产环境中,对于死锁发生原因的定位比较困难,读懂死锁日志是非常有必要的。下面我们来模拟死锁的产生,然后分析死锁日志。

Read more »

在InnoDB中,锁的类型有如下几种:

  • Shared and Exclusive Locks(共享S或独占X锁)
  • Intention Locks(意向锁)
  • Record Locks(记录锁)
  • Gap Locks(间隙锁)
  • Next-Key Locks
  • Insert Intention Locks(插入意向锁)
  • AUTO-INC Locks(自增锁)
Read more »

INFORMATION_SCHEMA提供对数据库元数据的访问、关于MySQL服务器的信息,如数据库或表的名称、列的数据类型或访问权限。其中有一个关于InnoDB数据库引擎表的集合,里面有记录数据库事务和锁的相关表,InnoDB INFORMATION_SCHEMA表可以用来监视正在进行的InnoDB活动,在它们变成问题之前检测低效,或者对性能和容量问题进行故障排除。在实际开发和应用中,会碰到和数据库事务相关的问题,比如事务一直未结束,出现行锁,表锁以及死锁等情况,这时我们就需要有一个快速定位问题行之有效的方法,所以我们来系统了解下INFORMATION_SCHEMA和定位事务问题。

Read more »