通常,我在看书的时候一般不写代码,因为我的脑袋被设定成单线程的,一旦同时喂给它不同的信息,它就无法处理。
但多线程对电脑来说就是小菜一碟,它可以同时做很多事,看起来匪夷所思。好希望把自己的大脑皮层移植到这些牛x的设备上。
用人脑思考电脑正在思考的问题,这本身就是一种折磨。但平常的工作和面试中,又不得不面对这样的场景,所以多线程就成了编程路上一块难啃的骨头。
HikariCP是SpringBoot默认的数据库连接池,它毫不谦虚的的起了一个叫做 光
的名字,这让国产Druid很没面子。
还是言归正传,看一下Hikari中的ConcurrentBag吧。
核心数据结构
多线程代码一个让人比较头疼的问题,就是每个API我都懂,但就是不会用。很多对concurrent包倒背如流的同学,在面对现实的问题时,到最后依然不得不被迫加上Lock或者synchronized。
ConcurrentBag是一个Lock free的数据结构,主要用作数据库连接的存储,可以说整个HikariCP的核心就是它。删掉乱七八糟的注释和异常处理,可以说关键的代码也就百十来行,但里面的道道却非常的多。
ConcurrentBag速度很快,要达到这个目标,就需要一定的核心数据结构支持。
private final CopyOnWriteArrayList<T> sharedList; private final ThreadLocal<List<Object>> threadList; private final AtomicInteger waiters; private final SynchronousQueue<T> handoffQueue;
-
sharedList
用来缓存所有的连接,是一个CopyOnWriteArrayList结构。 -
threadList
用来缓存某个线程所使用的所有连接,相当于快速引用,是一个ThreadLocal类型的ArrayList。 -
waiters
当前正在获取连接的等待者数量。AtomicInteger,就是一个自增对象。当waiters的数量大于0时候,意味着有线程正在