读深入理解高并发编程后相关总结

线程池

线程池构造方法

Executors 类可以方便构造常用的线程池。

底层真正调用的就两个

ThreadPoolExecutor

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

ForkJoinPool

Antlr4 支持中文空格

Oracle 是可以支持 中文空格的(\u3000)。因此 shardingSphere 的解析也需要支持。

查询 antlr4 的定义,首先我们遇到中文空格要像遇到英文空格一样跳过。

WS
    : [ \t\r\n\u3000] + ->skip
    ;

其次还需要将自定义的字符中排除 \u3000 没有找到正确的排除方法。因此考虑在范围定义中跳过 \u3000

IDENTIFIER_
    : [A-Za-z\u0080-\u2FFF\u3001-\uFF0B\uFF0D-\uFFFF]+[A-Za-z_$#0-9\u0080-\u2FFF\u3001-\uFF0B\uFF0D-\uFFFF]*
    ;

完美解决

OPE 加密算法

OPE 加密算法全称是 Order Preserving Encryption。加密后的内容依然具有原始数据的顺序性,如果实现了该算法后,SQL 可以支持密文的 range 查询和排序。

https://github.com/aymanmadkour/ope 该开源代码是 ope 的算法实现,可以实现数字,字符串的加密有序性。

jdbc Statement 无法取消的问题

问题描述

今天遇到一个奇怪的问题,我将运行中的 statement 信息缓存到内存集合中,通过另一个线程调用 statement.cancle() 接口,发现无论如何都取消不了,需要等到 statment 运行完,才能取消,可是这个取消已经没有意义了。

我的代码如下:

1
2
3
4
5
6
7
        for (Statement each : process.getDistributedJoinProcessStatements().values()) {
            if (null != each) {
                if (!each.isClosed()) {
                    each.cancel();
                }
            }
        }

我发现 debug 无论如何也走不下去,于是我不断点,每次卡住的时候就 dump 出结果

探索 HikariCP

项目地址: https://github.com/brettwooldridge/HikariCP

“Simplicity is prerequisite for reliability.” - Edsger Dijkstra

最先强调的就是简单,扁平,性能,做了 字节码级别的优化。 配置简单,很多东西选择不做,例如 statement 缓存。

pool size 比想象的要小的多,这样更能拥有更好的性能。因为单 cpu 并非并行,上下文切换需要时间,另外查询的位置需要来回切换等等。 不过 IO wait 比较大时,那么并发时能够提升的。 另外对于大事务和短事务,比较难以协调,这时候最好搞两个 pool。

HikariCP 怎么学习

考虑编译起来,然后运行 test 查看代码逻辑

  • testSealed1

通过 IDEA 运行时发现总会报 Error occurred during initialization of boot layer FindException: Module not found 后来发现 mvn clean 之后,可以运行,但是有部分代码是会在编译阶段被更改,因此还得 install 之后在跑 但是 idea 运行之前会 build 然后就改变了 target 下部分代码。 所以需要勾选运行前不 build 即可解决问题。