多图详解 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 地址和端口号
序列号:解 ...
多图详解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 对内存可见性作出了一些承诺,在承诺之外,开发者需要自己去处理内存可见性问题。
内存可见性问题上面提到了内存可见性问题,那么,什么是内存可见性 ...
【React Native进阶】React Native Reanimated的使用
前言上一篇文章讲解了React Native性能优化的总体思路,并进一步讲解了React Native Gesture Handler的使用。本文讲解另外一个库React Native Reanimated,这个库旨在解决React Native在动画方面的性能问题,让我们能够创建运行在UI线程上的顺滑动画和流畅交互。
Reanimated实现动机上一篇文章讲了React Native中业务逻辑和计算都是在JavaScript线程中,渲染是在UI线程中,两个线程是通信又是异步的,因此渲染并不是实时的,至少会有1桢的延迟,在动画方面也是同样的。
Reanimated将JavaScript线程上的动画和事件处理逻辑转移到了UI线程。它通过定义Reanimated worklet(可以被移动到一个单独的JavaScript 虚拟机并在UI线程上同步运行的一小段JavaScript代码)来实现。这种机制让我们的触摸事件可以立即被响应并在同一桢上更新UI,不必再担心JavaScript加载和同步这些问题。
注意:本文讲解的是当前最新的版本2.0.0-alpha.9,它与版本1有较大的差异。
...
【React Native进阶】React Native Gesture Handler的使用
背景说到React Navtive的性能优化,首先要了解React Native的运行机制。React Native程序主要运行在三个并行的线程上:
JavaScript Thread:我们写的JavaScript代码逻辑都是在这个线程上执行;
UI Thread:即原生线程,当我们需要调用原生的渲染或者能力时会运行到这个线程上;
Shadow Thread:这个线程创建和管理着Shadow Tree,它类似于虚拟DOM。它通过Yoga引擎着Flexbox布局转化为原生的布局方式。
这三个线程独立运行的情况下,性能良好,但如果涉及到事件驱动与UI线程有交互的情况,React Native的这种设计效果不佳。
当与触摸屏交互时,用户希望屏幕上的效果是即时的。如果更新发生在单独的线程中,通常情况下,在JavaScript线程中所做的更改无法反映在同一帧中。在React Native中,默认情况下,由于UI和JavaScript线程之间的通信是异步的,并且UI线程从不等待JavaScript线程完成处理事件,因此所有更新都会延迟至少一个帧。
而且由于UI线程与其他线程通信存在序列化和反序 ...
【React Native教程】Stack Navigation与Tab Navigation嵌套最佳实践
背景上一篇文章详细讲解了react-navigation的使用,这篇文章主要说一下Stack Navigation与Tab Navigation嵌套的问题。
在iOS原生开发中,一般是在TabController里嵌套NavigationController,也就是说底部导航控制器里放多个堆栈导航控制器,每个堆栈导航控制器控制有独立的堆栈和状态。
但如果在使用react-navigation进行这种嵌套方式,由于根控制器是底部的TabNavigation,每次跳转到子控制器时,底部的导航栏不会隐藏。官方文档说可以用属性更改的方法隐藏底部导航栏,但不推荐,会影响性能。因此本文主要讲解如何使用堆栈导航器中嵌套底部导航控制器来解决这个问题。
实现方式首先将Main控制器放入Stack Navigation中:
123456789101112131415161718192021class App extends Component { render() { return ( <NavigationContainer> ...
【React Native】Redux自定义中间件
前言在上一篇文章中介绍了Redux在React Native中的基本使用,这篇文章介绍一下如何在Redux中自定义中间件。
中间件功能中间件的作用主要是拦截指定的Action,进行自定义操作后继续执行该Action或指派执行其他Action。这里拦截的Action主要是指同步的Action,异步Action在Thunk中间件已经提供了相关功能。
自定义流程创建中间件以上一篇文件的Demo为例,这里添加一个参数检查的中间件。新建CheckParameterMidleware.js,添加如下代码:
1234567891011121314151617181920export function checkParameterMiddleware({ dispatch }) { return function(next){ return function(action){ console.debug(action); if (action.type === 'counte ...
【React Native教程】Redux入门教程
Redux定义Redux在官网上是这么定义的:A Predictable State Container for JS Apps,直译过来就是一个使用在JS应用上的可预测的状态容器。
Redux解决的问题React Native本身是基于前端的React框架,它是通过State来管理页面显示和参数更新。如果在交互比较复杂的页面、需要多页面状态传递或者同步更新状态的情况,状态管理就会比较麻烦。使用Redux就可以解决这些问题。
Redux的核心逻辑和概念Redux的核心逻辑是集中定义和管理状态和动作执行,各个页面使用connect方法绑定相应的方法和状态,并通过发送动作指令更新页面显示。达到状态和操作与页面隔离的效果。
StateState即状态,是React框架最基础的概念之一,通过更改状态实时更新页面显示。
1234{ prop1: value1, prop2: value2,}
ActionAction是指指令或者动作。在Redux中,页面不直接管理状态,每个页面都是通过发送Action间接地更新状态。Action中有两个参数,一个是Type,字符串类型, ...
【React Native】React Navigation 5.x的使用
前言在App中,底部TabBar导航和顶部的导航栏导航是最常见的页面导航方式,而React Native官方推荐的第三方库是@react-navigation,正好今年React Navigation发布了5.0版本,与前面的版本差别还挺大,不过使用上更方便了。本文主要讲解React Navigation5.0及以上版本的使用。
安装安装核心包
1234# NPMnpm install @react-navigation/native# Yarnyarn add @react-navigation/native
安装依赖
12345# NPMnpm install react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-community/masked-view#Yarnyarn add react-native-reanimated react-native-gesture-handler reac ...