1.成员变量

 private static final AtomicIntegerFieldUpdater<AbstractReferenceCountedByteBuf> refCntUpdater;static {AtomicIntegerFieldUpdater<AbstractReferenceCountedByteBuf> updater =PlatformDependent.newAtomicIntegerFieldUpdater(AbstractReferenceCountedByteBuf.class, "refCnt");if (updater == null) {updater = AtomicIntegerFieldUpdater.newUpdater(AbstractReferenceCountedByteBuf.class, "refCnt");}refCntUpdater = updater;}private volatile int refCnt = 1;

AtomicIntegerFieldUpdater是什么鬼?先研究一下atomic包下的两个重要的类
1.AtomicInteger的使用
AtomicInteger ℹ=new AtimicInteger(0);
这样变量i就有了原子性

2.AtomicintegerFieldUpdater的使用
public static AtomicIntegerFieldUpdaternewUpdater(Class tclass,
String fieldName)
这里就不详细分析他的源码了,其实很简单,他让tclass的成员fieldName具有了原子性,是不是很简单~

研究完再回来看他的成员变量,实在不能太简单。
AbstractReferenceCountedByteBuf源码实现,该类主要是实现引用计算的常规方法,充分利用voliate内存可见性与CAS操作完成refCnt变量的维护。

2.实现的函数

在这个类的函数中,看到了很熟悉的东西release(),retain(),refcnt(),touch()这些方法,天呐,这不就是ByteBuf类,AbstarctByteBuf类中没有实现的方法吗?原来都拿到这里来实现了。上代码!

 @Overridepublic ByteBuf retain() {for (;;) {int refCnt = this.refCnt;if (refCnt == 0) {throw new IllegalReferenceCountException(0, 1);}if (refCnt == Integer.MAX_VALUE) {throw new IllegalReferenceCountException(Integer.MAX_VALUE, 1);}if (refCntUpdater.compareAndSet(this, refCnt, refCnt + 1)) {break;}}return this;}

每调用一次retain方法,计数器加一
compareAndSet方法用来获取自己的值和期望的值进行比较,如果其间被其他线程修改了,那么比对失败,进行自旋操作,重新获得计数器重新比较
compareAndSet这个方法是CAS操作,由操作系统层面提供。

 @Overridepublic final boolean release() {for (;;) {int refCnt = this.refCnt;if (refCnt == 0) {throw new IllegalReferenceCountException(0, -1);}if (refCntUpdater.compareAndSet(this, refCnt, refCnt - 1)) {if (refCnt == 1) {deallocate();return true;}return false;}}}

每调用一次release方法,计数器减1
同样用compareAndSet进行自旋操作。

AbstractReferenceCountedByteBuf源码分析相关推荐

  1. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  2. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  3. SpringBoot-web开发(二): 页面和图标定制(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...

  4. SpringBoot-web开发(一): 静态资源的导入(源码分析)

    目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...

  5. Yolov3Yolov4网络结构与源码分析

    Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...

  6. ViewGroup的Touch事件分发(源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...

  7. View的Touch事件分发(二.源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...

  8. MyBatis原理分析之四:一次SQL查询的源码分析

    上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: Java代码   String res ...

  9. [转]slf4j + log4j原理实现及源码分析

    slf4j + log4j原理实现及源码分析 转载于:https://www.cnblogs.com/jasonzeng888/p/6051080.html

最新文章

  1. 设计模式——3单例模式(Singleton)
  2. invalidate
  3. Linux安全漏洞审计工具Lynis
  4. Kinect学习(七):综合提取彩色、深度、人体骨骼点
  5. 机房环境监控系统基础知识
  6. BIEE建模参考规范
  7. pyhton 读取目录下所有文件夹下的文件(指定文件)
  8. SQL Server中追踪器Trace的介绍和简单使用-----(转)
  9. OpenStack Glance(镜像服务)基础架构:Basic architecture
  10. USB 3.1 与 Type-C 接口有什么关系呢
  11. 利用可达矩阵判断连通性_leetcode240. 搜索二维矩阵 II
  12. 是的,我开始做这么一件事了
  13. 卡方检验还是费歇尔精确检验?
  14. 截止失真放大电路_反馈/反馈电路/反馈类型的判别方法
  15. Keepalived主主虚拟路由器与虚拟服务器
  16. 程序员一年多少行_程序员版的倚天屠龙,看完泪奔!
  17. 【论文阅读|浅读】DeepEmLAN: Deep embedding learning for attributed networks
  18. Raspberry Pi使用USB摄像头远程监控
  19. Backend For Frontend 实践心得
  20. android自定义渐变色,Android如何设置渐变色背景 | 夕辞

热门文章

  1. 给Source Insight做个外挂系列之三--构建外挂软件的定制代码框架
  2. C/C++中容易造成内存溢出的函数
  3. 嗅探(被动嗅探)与ARP欺骗(主动嗅探)详解
  4. Redis 五种数据类型
  5. 音视频技术开发周刊 | 190
  6. LiveVideoStack线上分享第四季(十二):实时音视频抗丢包的实践
  7. Twitch未来五年的视频编码战略:从H.264到 AV1
  8. webrtc一对一通话
  9. 「递归」第9集 | 我在腾讯做研究
  10. 「递归」第2集 | 变得了魔术,解得了高数,这届鹅厂程序员有点酷