Netty 源码深度剖析
上一篇文章多图详解 Netty 把 Netty 编程所需的知识点详细讲了一遍,从文章中也可以看出 Netty 的组件比较多,使用的灵活性也比较大,如果对组件不熟悉一不注意就会掉坑里。Netty 编程几乎所有的问题其实都可以从源码中找到答案,下面我们就来深入了解一下 Netty 的源码。
Netty 的服务器与客户端源码都是差不多的,而且服务器要相对复杂一点,因此本篇源码解析主要针对服务器。
下面是本次源码解析使用到的示例代码。
服务器端:
123456789101112131415161718192021222324252627public class NettyServer { public static void main(String[] args) throws InterruptedException { EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); ...
多图详解 Netty
多图详解 Netty什么是 Netty简单来说Netty就是JBOSS开源的一个基于NIO的网络编程框架。它可以帮助我们快速开发高性能高可靠性的网络 IO 程序。
Netty在 Java 语言中使用非常广泛,涉及到网络通信的基本上都使用Netty,很少会直接去使用原生的NIO组件或者是其他框架。并且像Dubbo、RocketMQ、Zookeeper、ElasticSearch 这些知名的中间件所使用的网络通讯框架都是基于Netty去实现的。
Netty是在原生NIO的基础上发展起来的框架,其中的许多理念都非常像,所以学习Netty前需要了解一下原生NIO编程。
原生 NIO 编程在了解原生NIO编程之前需要了解一个基础概念Socket。
SocketNetty是基于TCP协议的,我们知道TCP协议三个重要的特点分别是面向连接、可靠的和字节流。要达成这三点建立连接时需要客户端与服务端达成三个信息的共享,分别是:
Socket:包含五个信息:连接使用的协议、本地主机 IP 地址和端口号、远程主机的 IP 地址和端口号
序列号:解决乱序问题
容器大小:用来做流量控制
Socket就是 ...
多图详解AQS
什么是AQSAQS 的全称是 AbstractQueuedSynchronizer ,从字面理解它就是抽象的队列同步器。它是可重入锁、各种同步工具类(共享锁)和条件等待唤醒机制实现的基石。
AQS 有一个重要的属性 state,它的值直接关系着其他线程能否获取到锁。
如果我们看过可重入锁、各种同步工具类(共享锁)的源码,会发现这些锁的关注点都在于通过 AQS 的 state 值或者能否通过 CAS 修改 state 的值来判断当前线程能否获取到锁(这里判断是否能获取到锁都是靠 AQS 的子类 Sync 和 Sync的子类实现的,而这些子类的具体方法是锁自己去实现的——归根到底这部分就是锁来实现的)。如果获取锁成功,直接扣减 AQS 的 State 值,不会涉及到 AQS。但如果当前线程获取锁失败,那么剩下的包括阻塞唤醒线程、重新发起获取锁之类的操作全都都会扔给 AQS 。简单来说就是 AQS 包揽了同步机制的各种工作。这就是为什么理解了 AQS 再去理解各种锁就会非常容易,它的重要性也就不言而喻了。
下图就是线程获取锁的大致流程:
下面就是使用 AQS 实现的最简单的独占锁,从 ...
详解Java类加载过程
概述类从被加载到虚拟机开始,到卸载出内存,整个生命周期分为七个阶段,分别是加载、验证、准备、解析、初始化、使用和卸载。其中验证、准备和解析这三个阶段统称为连接。整个过程如下图所示:
加载、验证、准备、初始化和卸载这五个阶段顺序是确定的,类的加载过程这些阶段必须按这个顺序开始(注意这里强调的开始的顺序,进行和完成可能是交叉混合着的)。由于 Java 支持动态绑定,在动态绑定时解析阶段会在初始化之后执行。
类加载时机上面讲到类的分为七个阶段,那么什么情况下会开始类的加载呢?
思考这个问题我们可以从两个维度出发,一个是 JVM 规范维度,一个是从虚拟机运行的维度;
JVM 规范维度 JVM 规范没有强制约束类的加载时机,但 Java 虚拟机严格规定了有且只有5种情况必须立即对类进行”初始化”,执行初始化自然必须先执行前面的步骤。
遇到 new、getstatic、putstatic、或 invokestatic 这4条字节码指令时,如果类没有初始化,则需要先触发其初始化。其对应的场景分别为:使用 new 关键字初始化实例对象的时候、读取或设置一个类的静态字段(被 final 修饰、 ...
JMM - Java 内存模型
JMM定义JMM 即 Java Memory Model,也叫 Java 内存模型。JMM 就是一种规范,它定义了什么情况开发者不需要去感知计算机的各种重排序,什么情况需要开发者去干涉重排序,以保证程序的执行结果可预测。
JMM的由来计算机这么多年来整体运行速度不断地提升,除了像CPU时钟频率、内存读写速度等硬件性能不断提升之外,还要归功于计算机科学家对于计算机对于各种指令处理效率的不断优化,包括超标量流水线技术,动态指令调度,猜测执行,多级缓存技术等。在这其中,允许重排序对于计算机运行效率的提升产生了重要的作用,但同时也带来了一些问题。计算机只能确保单线程情况下重排序对于运行结果没有影响,对于多线程就无能为力了。这个时候就需要一个规范来保证开发者既能享受重排序带来的性能的提升又能让复杂情况下的运行结果可控,JMM 就是这样一个规范。JMM 规定了 JVM 必须遵循的一组最小保证,这组保证规定了对变量的操作何时对其他线程可见。换句话说,JMM 对内存可见性作出了一些承诺,在承诺之外,开发者需要自己去处理内存可见性问题。
内存可见性问题上面提到了内存可见性问题,那么,什么是内存可见性 ...
AFNetworking源码上传图片部分完整解析
最近在开发SDK时有上传图片的需求,这个需求用AF的话当然非常简单,多添加一句代码就可以搞定。但为避免第三方耦合并没有使用AFNetworking,这就需要自己走完上传图片的全部流程,所以仔细研究了一下AFNetworking的相关源码,梳理了整个流程,它的流程大致是这样的:
<img src=”http://ogdqxib8j.bkt.clouddn.com/image/png%E5%9B%BE%E7%89%87%E4%B8%8A%E4%BC%A0.png" title:”AFNetworking图片上传流程”>
看着有点眼花眼花缭乱是吧,没关系,接着往下看,看完这篇文章,你也可以自己封装一套图片上传网络工具类。
目录
基本原理
具体实现
创建NSMutableURLRequest并设置请求方式为POST
自定义HTTPBodyStream
对request进行参数设置
通过NSURLSession的uploadTaskWithStreamedRequest:方法发起Post请求
基本原理首先我们来看一下AF中上传图片的方法长什么样:
123456- ...
【iOS】超简单的思路实现2048游戏
最近在网上下了一个仿2048游戏的Demo,发现里面的实现思路做得比较复杂:将数字块的移动操作封装成模型并保存起来,然后根据操作模型的值对滑块逐块地进行操作,具体的实现方式可以自己下下来感受一下。
然后我分析了一下这个游戏,重新整理了一种更简单的实现思路,大体可以分为三步:
界面布局
数字块操作
按方向把所有数字块分成4组,然后进行排序
查找邻近相同数字块,计算该行(列)合并后的块数
按方向整行(列)同时移动数字块
移动块的同时随机添加数字块
游戏结束重置游戏
实现效果如下:
具体实现##界面布局界面布局是最简单的一步,主要分为三大块:分数栏,游戏背景板和数字块背景,以下是代码:
123456789101112131415161718192021private func setupUI() { let boardWH = SCREEN_WIDTH - boardLeftMargin * 2 let gameBoard = ZYGameBoard(frame: CGRect(x: 0, y: 0, width: boardWH, height: b ...
CAShapeLayer文字动画
文字动画也是CAShapeLayer图形动画的一种,巧妙运用文字动画可以实现很不错的效果,比如半糖app的下拉动画。本文就主要讲一下其实现原理。
文字动画主要分为两部分:
将文字转化为CAShapeLayer
通过更改CAShapeLayer的StrokeEnd属性值生成动画
将文字转换为CAShapeLayer将文字转换为CAShapeLayer的过程比较复杂,可以细分为以下几个步骤:
创建NSAttributedString并生成CTLineRef
使用CTLineRef生成CTRunRef数组
遍历CTRunRef数组,得到每个CTRunRef
遍历CTRunRef中每个长度为1的区间生成CGGlyph并转换为CGPath路径,将所有路径拼接起来
创建ShapeLayer并将生成的路径赋值给该ShapeLayer
以下是每个步骤的实现方式:
创建NSAttributedString并生成CTLineRef123456// 定义字体属性CTFontRef font = CTFontCreateWithName(CFSTR("HelveticaNeue- ...
CAShapeLayer的使用
简介官方文档对CAShapeLayer的定义如下:
A layer that draws a cubic Bezier spline in its coordinate space.
可以理解为CAShapeLayer是其坐标空间内绘有贝塞尔曲线的图层。使用CAShapeLayer可以制作蒙板和图层动画,它继承自CALayer,拥有CALayer的全部属性。CAShapeLayer的依赖于贝塞尔曲线UIBezierPath,它决定的ShapeLayer的形状。
StrokeStart和StrokeEnd是ShapeLayer的重要属性,它控制ShapeLayer的cgPath路径的绘制起点和终点,区间都为0~1,0代表从头绘制,1代表绘制到终点。
目录
ShapeLayer图形动画
ShapeLayer蒙版
本文demo的github地址:https://github.com/zephyrw/ShapeLayerDemo.git
使用ShapeLayer图形动画动画简介使用ShapeLayer制作动画原理是通过改变ShapeLayer的strokeEnd属性值来改变ShapeL ...
正则表达式
以下是对正则表达式学习的一些整理。
头部尾部^ 表示开始 后接字符串 ^one
$ 表示结束 前接字符串 dog$
“banana” 必须包含此字符串
限制个数* 0个或更多个 ab* (a,ab,abbb…)
+ 1个或更多个 ab+ (ab, abbb…)
? 0个或1个 ab? (a, ab)
{4} 4个 ab{4} (abbbb)
{1,} 至少1个 ab{1,} (ab, abbb…)
{3,4} 3个到4个 ab{3,4} (abbb, abbbb)
注:必须有下限,ab{,5}是错误的
或| 表示或 (a|b)e (ae, be)
字符范围[a-z] 所有小写字母
[0-9] 数字
. 任意字符
连续字符\4 连续有4个字符 (.)\4 连续4个相同字符
{1,2} 连续1个或者2个字符 10{1,2} (10,100)
{3,} 连续3个以上字符 0{3,} (000,0000)
不希望出现的字符^ 后接不希望出现的字符 @[^a-zA-Z]@ 两个@之前不能有字母
其他\d 匹配一个数字字 ...






