主要来自于:com.alibaba.druid.pool.DruidDataSource 类

1: AtomicLongFieldUpdater的用法

AtomicLongFieldUpdater<DruidAbstractDataSource> executeQueryCountUpdater = AtomicLongFieldUpdater.newUpdater(DruidAbstractDataSource.class, "executeQueryCount");

收获:

参考例子:笑谈java并发编程四之AtomicIntegerFieldUpdater介绍_一个瘦子的梦想的博客-CSDN博客

关于AtomicInteger/AtomicIntegerArray都比较简单,如何使用可以查相应的API文档,对于AtomicIntegerFieldUpdater 的使用稍微有一些限制和约束,约束如下:
字段必须是volatile类型的,在线程之间共享变量时保证立即可见.eg:volatile int value = 3
字段的描述类型(修饰符public/protected/default/private)是与调用者与操作对象字段的关系一致。也就是说调用者能够直接操作对象字段,那么就可以反射进行原子操作。但是对于父类的字段,子类是不能直接操作的,尽管子类可以访问父类的字段
只能是实例变量,不能是类变量,也就是说不能加static关键字。
只能是可修改变量,不能使final变量,因为final的语义就是不可修改。实际上final的语义和volatile是有冲突的,这两个关键字不能同时存在。
对于AtomicIntegerFieldUpdater和AtomicLongFieldUpdater只能修改int/long类型的字段,不能修改其包装类型(Integer/Long)。如果要修改包装类型就需要使用AtomicReferenceFieldUpdater。

好处是节省内存,假如不使用这样的语法,你可能需要创建 AtomicInteger,AtomicLong 很多的内存。

2:ReentrantLock 信号量的使用

protected ReentrantLock                            lock;protected Condition                                notEmpty; //连接池不空的信号量,假如空来的话 会阻塞protected Condition                                empty;

收获:

一般很多阻塞队列的原理都是基于这种形式来实现的,这种线程之间的通信机制效率很高。

3:volatile的用法

 // 进行连接的中转,新建的会放到池子里面,当被使用的时候 会被移除,当调用close 会重新被放到池子里面private volatile DruidConnectionHolder[] connections;

volatile 不单单用于数值类型,集合,数组,字符串都可以,主要是解决线程之间可见性的问题。

4:CountDownLatch 用法

final CountDownLatch             initedLatch               = new CountDownLatch(2);

在druid里面来实现资源初始化等待机制,等全部资源初始化好了之后才进行下面的操作。

Druid连接池源代码分析之五-编程知识点相关推荐

  1. Druid连接池源代码分析之五-starter

    详细分析: 待完善.

  2. Druid连接池源代码分析之一

    Druid功能简介 Druid是阿里开源的连接池,连接池的主要作用是为了复用,比如一般的数据库建立一个连接需要初始化很多对象,并且再加上tcp的三次握手,四次挥手的协议,所以整体的代价比较高,并且在一 ...

  3. Druid连接池源代码分析之四-java.lang.sql 规范

    总体思路: 1:首先java.lang.sql包下面提供了完整操作数据库的高度抽象接口,假如想实现操作数据库的能力实现这些接口就可以了(其中也包含了连接池),具体接口的能力看下文. 2:我们一直使用的 ...

  4. Druid连接池源代码分析之二-获取连接

    整体思路: 1:druid首先是连接池,DruidConnectionHolder[] 是通过对象数组来实现连接池的池子的,然后动态的维护下表,所以就要求并发性需要比较高,不然很容导致下表不准的现象. ...

  5. Druid连接池源代码分析之三-回收连接

    整体思路 1:DruidConnectionHolder[] connections 来表示还未使用连接池的连接的数量.假如程序中想获取一个连接的时候,首先先判断池子里面还是否有连接,假如有会直接获取 ...

  6. Druid连接池 报错:abandon connection原因分析

    问题现象: 使用Druid的数据库连接池,在进行一个查询SQL的时候,抛出了异常: [2017-10-20 01:40:59.269 ERROR com.alibaba.druid.pool.Drui ...

  7. 应用使用Druid连接池经常性断链问题分析

    前段时间有应用使用Druid连接池经常的提示断链报错,整个问题排查分析过程很有意思.这里将Druid连接池.数据库层以及负载均衡层的配置分析下,记录整个问题的分析过程,同时梳理下Druid连接池的配置 ...

  8. mybatisplus 集成druid连接池源码分析

    mybatisplus 集成druid连接池源码分析:从spring的源码过渡到druid的相关jar包,里面是druid相关的类,下面我们开始分析: 1.取数据库连接的地方入口:public abs ...

  9. JDBCC3P0连接池Druid连接池

    typora-root-url: img typora-copy-images-to: img JDBC&连接池 回顾 会使用mysql字符串函数 CONCAT: 连接字符串 CHAR_LEN ...

最新文章

  1. 烂泥:高负载均衡学习haproxy之TCP应用
  2. 节能信标无线感应定位测试:200kHz
  3. git bash打印当前文件结构_6 个方便的 Git 脚本
  4. python爬虫项目实例-Python爬虫开发与项目实战
  5. mysql分区方案的研究
  6. 方程的根的个数C语言xtu_零度根轨迹的绘制及情况讨论、以及参数根轨迹的原理介绍...
  7. idea java 代码混淆加密_使用 IntelliJ IDEA 开发一般 Java 应用程序时配置 Allatori 进行代码混淆...
  8. ios 顶部tab滑动实现_iOS开发之多表视图滑动切换示例(仿头条客户端)
  9. dataframe数据标准化处理_数据处理中的标准化、归一化究竟是什么?
  10. python基础入门(5)之运算符
  11. Maven安装配置操作
  12. C++设计模式-Flyweight享元模式
  13. 华为机试——字串的连接最长路径查找
  14. java中的ackerman_java8的函数式接口
  15. userscript ajax,在Greasemonkey的userscript文本追加到一个表单时使用Ajax提交
  16. 国内跨省游正式开放!旅行社要怎么抓住这个机会?
  17. 计算机组装中如何看硬件型号,如何查看主板型号?(三种方法!)
  18. 山东大学软件工程应用与实践——RIME输入法配置文件分析
  19. VS Code, VS 2022 使用正则表达式进行替换
  20. 酒店管理系统数据库设计

热门文章

  1. 【论文精读】NeRF —— 解读《NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis》
  2. 家乡的春节html,家乡的春节作文
  3. 2009年天津、陕西、湖北三地联考
  4. 一份机器学习与AI入门的学习笔记!
  5. 做一款解压且好玩的微信小游戏
  6. 见缝插针(Python)
  7. 如何根据地图上的两个坐标点来确定方向
  8. buuojCTF pyre
  9. word空白页怎么删除
  10. 王道代码题汇总(持续更新)