Druid连接池源代码分析之五-编程知识点
主要来自于: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连接池源代码分析之五-编程知识点相关推荐
- Druid连接池源代码分析之五-starter
详细分析: 待完善.
- Druid连接池源代码分析之一
Druid功能简介 Druid是阿里开源的连接池,连接池的主要作用是为了复用,比如一般的数据库建立一个连接需要初始化很多对象,并且再加上tcp的三次握手,四次挥手的协议,所以整体的代价比较高,并且在一 ...
- Druid连接池源代码分析之四-java.lang.sql 规范
总体思路: 1:首先java.lang.sql包下面提供了完整操作数据库的高度抽象接口,假如想实现操作数据库的能力实现这些接口就可以了(其中也包含了连接池),具体接口的能力看下文. 2:我们一直使用的 ...
- Druid连接池源代码分析之二-获取连接
整体思路: 1:druid首先是连接池,DruidConnectionHolder[] 是通过对象数组来实现连接池的池子的,然后动态的维护下表,所以就要求并发性需要比较高,不然很容导致下表不准的现象. ...
- Druid连接池源代码分析之三-回收连接
整体思路 1:DruidConnectionHolder[] connections 来表示还未使用连接池的连接的数量.假如程序中想获取一个连接的时候,首先先判断池子里面还是否有连接,假如有会直接获取 ...
- Druid连接池 报错:abandon connection原因分析
问题现象: 使用Druid的数据库连接池,在进行一个查询SQL的时候,抛出了异常: [2017-10-20 01:40:59.269 ERROR com.alibaba.druid.pool.Drui ...
- 应用使用Druid连接池经常性断链问题分析
前段时间有应用使用Druid连接池经常的提示断链报错,整个问题排查分析过程很有意思.这里将Druid连接池.数据库层以及负载均衡层的配置分析下,记录整个问题的分析过程,同时梳理下Druid连接池的配置 ...
- mybatisplus 集成druid连接池源码分析
mybatisplus 集成druid连接池源码分析:从spring的源码过渡到druid的相关jar包,里面是druid相关的类,下面我们开始分析: 1.取数据库连接的地方入口:public abs ...
- JDBCC3P0连接池Druid连接池
typora-root-url: img typora-copy-images-to: img JDBC&连接池 回顾 会使用mysql字符串函数 CONCAT: 连接字符串 CHAR_LEN ...
最新文章
- 烂泥:高负载均衡学习haproxy之TCP应用
- 节能信标无线感应定位测试:200kHz
- git bash打印当前文件结构_6 个方便的 Git 脚本
- python爬虫项目实例-Python爬虫开发与项目实战
- mysql分区方案的研究
- 方程的根的个数C语言xtu_零度根轨迹的绘制及情况讨论、以及参数根轨迹的原理介绍...
- idea java 代码混淆加密_使用 IntelliJ IDEA 开发一般 Java 应用程序时配置 Allatori 进行代码混淆...
- ios 顶部tab滑动实现_iOS开发之多表视图滑动切换示例(仿头条客户端)
- dataframe数据标准化处理_数据处理中的标准化、归一化究竟是什么?
- python基础入门(5)之运算符
- Maven安装配置操作
- C++设计模式-Flyweight享元模式
- 华为机试——字串的连接最长路径查找
- java中的ackerman_java8的函数式接口
- userscript ajax,在Greasemonkey的userscript文本追加到一个表单时使用Ajax提交
- 国内跨省游正式开放!旅行社要怎么抓住这个机会?
- 计算机组装中如何看硬件型号,如何查看主板型号?(三种方法!)
- 山东大学软件工程应用与实践——RIME输入法配置文件分析
- VS Code, VS 2022 使用正则表达式进行替换
- 酒店管理系统数据库设计