0%

以前喜欢买书来看,有空捧着一本书静静的读着,这种感觉仿佛时间都停止了,现在参加了工作,时间变得相对少些,所以看电子书的频率高些(微信读书和Kindle),因为电子书看着方便,但对眼睛有伤害,看时间长了会眼睛疲劳,不过能过看书的瘾,也挺好^_^

Read more »

平时我们用MySQL,字符编码方式一般是 utf8 或者 utf8mb4,至于MySQL内部是如何处理编码问题的在日常开发中并没有十分关注,遇到最多的问题也无非是表中中文乱码和表情无法存储。对于编码不一致的问题,出问题是在所难免的,我们需要系统地了解下在MySQL内部字符集是如何配置和转化的。

Read more »

咳咳,趁着2019年的小尾巴,总结下这一年我都干了些什么吧。最近几年每年年初几乎都要立flag,其实flag不是说我今年一定要搞成什么样子,而是让自己能够坚持做一件事情,至少正儿八经地定一个目标。

Read more »

在维基百科中,关于分治算法(divide-and-conquer)的介绍如下:在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个概念非常好理解,一个操作的计算规模很大,直接计算比较困难,如果可以将该问题分解为多个子问题进行计算,并且合并这些计算结果与原计算结果期望一致,那么这样就再好不过了。

单从上述概念来理解,我们不难发现,利用分治算法有一个分解与合并的过程,至于分解后的小规模问题如果解决,可以继续利用分治思想继续进行分解,直至可以直接计算。这就形成了递归。所以利用分治算法求解问题一般有三个步骤:

  1. 分解:将原问题分解为若干个规模较小,相对独立,与原问题形式相同的子问题。
  2. 解决:若子问题规模较小且易于解决时,则直接解。否则,递归地解决各子问题。
  3. 合并:将各子问题的解合并为原问题的解。

在看邓公数据结构和算法课程时,提到了减而治之(减治)和分而治之(分治)。两者都是将问题规模缩小,但缩小的方式是不同的,适用场景也是不同的,这里结合教材来总结下这两者异同点。

Read more »

最近在看邓俊辉邓公的《数据结构和算法》课程,其中在讲Vector时提到了唯一化算法,也就是我们熟悉的去重算法,该算法实现相当简单,但却很高效。如果我们不借助Java任何已有的数据结构和方法,想对一个集合去重,最低效的算法是遍历其集合,找出每个重复元素存在的区间,每个区间只保留一个元素即可,这就涉及到remove 操作,最坏的情况下,每次都要调用remove方法,时间复杂度累计到$O(2^n)$,显然十分低效。

Read more »

第一个看到树状数组(Binary Indexed Tree)这个数据结构时,真的被吸引了,设计真是简洁,属于理论很复杂,但实现不复杂的那种算法。该算法多用于高效计算数列的前缀和, 区间和动态单点值的修改。要理解树状数组的工作原理,必须要知道二进制的运算法则,比如 &-、补码和反码等。下面先介绍下二进制的一些简单运算。

Read more »

近日发现项目日志中有关于MQ的异常日志,Rabbit在进行自我检查时,发现没有Channel可用了,报出org.springframework.amqp.AmqpTimeoutException: No available channels异常,这个异常具体是由什么引起的呢?

Read more »

了解到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 »

最近看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 »

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

Read more »