netty面试题及netty权威指南总结 -04--行业应用篇

netty的三层架构:

下面层: Reactor 通信调度层:

由一系列辅助类完成,包括Reactor线程NioEventLoop及其父类, NioSocketChannel/NioServerSocketChannel 及其父类, ByteBuffer 以及 由其衍生出来的各种内部类等。  该层的主要职责 就是监听网络的读写和连接操作, 负责将网络层的数据读取到内存缓冲区中, 然后触发各种网络事件,例如 连接创建, 连接激活, 读事件,写事件等; 将这些事件 触发到 PipeLine中, 由PipeLine管理的职责链 来进行后续的处理。

中间层 : 职责链ChannelPipeline

它负责 事件在职责链中的有序传播,同时负责动态地编排职责链。

职责链可以选择监听和处理自己关心的事件,他可以拦截处理和向后/向前传播事件。 不同应用的Handler节点的功能也不一样。

上面层:  业务逻辑 编排层(Service ChannelHandler)

业务逻辑编排层 通常有两类:

一类是 纯粹的业务逻辑编排, 还有一类是 其他的应用层协议插件, 用于特定协议相关的会话和链路管理。

架构的不同层面,需要关心和处理的对象都不同。 通常情况下,对于业务开发者,只需要关心职责链的拦截和业务handler的编排。  因为应用层协议栈往往是开发一次,到处运行。

各种协议以插件的形式提供,只有协议开发人员需要关心协议插件; 对于其他业务开发人员来说,只需要关心业务逻辑定制。

netty的两种业务心跳 检测机制:

读空闲超时机制:当连续周期T没有消息可读时,触发超时Handler,用户可以基于读空闲超时 发送心跳消息,进行链路检测。

写空闲超时机制:当连续周期T没有消息可写时,触发超时Handler,用户可以基于写空闲超时 发送心跳消息,进行链路检测。

java多线程编程在netty中的应用:

Java内存模型:

1 工作内存和主内存(java内存访问模型):

java内存交互协议:8个动作: lock, unlock, read, load ;  use, assign,store, write 。

java的线程: 由内核线程实现 或者 用户线程实现。

正确使用锁:

1 wait方法 用来是线程等待某个条件,它必须在同步块内部被调用, 这个同步块 通常会 锁定当前对象实例。

2 当多个线程 共享同一个变量的时候,每个读或者写数据的操作方法 都必须加锁进行同步, 如果没有正确的同步,就无法保证一个线程所做的修改 被其他线程共享。

volatile的正确使用:

关键字volatile  是java提供的最轻量级的同步机制, java内存模型对volatile专门定制了一些特殊的访问规则。

一个变量被volatile修饰后,将具备以下两种特性:

1 线程可见性:当一个线程 修改了被volatile修饰的变量之后,无论是否加锁,其他线程都可以立即看到最新的修改, 而普通变量 做不到这一点。

2 禁止指令重排序优化:普通的变量 仅仅保证在该方法的执行过程中 所以依赖赋值结果的地方 都能获取正确的结果,而不能保证变量赋值操作的顺序与程序代码的执行顺序一致。

具体参考网址: https://www.cnblogs.com/xdecode/p/8948277.html

根据经验总结,volatile 最适合使用的 是一个线程写,其他线程读的场合; 如果有多个线程并发写的操作,仍然需要 使用锁 或者 线程安全的容器 或者  原子变量来 代替。

CAS指令和原子类:

互斥同步 最主要的问题是 进行线程阻塞和唤醒所带来的性能的额外损耗,这种同步 被称为 阻塞同步,属于一种悲观的并发策略,称为悲观锁。

随着硬件和操作系统指令集的发展和优化,产生了非阻塞同步,被称为乐观锁。 

目前java中 最广泛的非阻塞同步 就是 CAS。 CAS由Unsafe类里的 compareAndSwapInt()等方法包装提供。 JDK提供了很多CAS包装类 简化开发者的使用,如 AtomInteger 。

使用java自带的 Atomic原子类,可以避免同步锁 带来的并发访问性能下降的问题,减少犯错的机会。 因此,Netty中 对于int,long,boolean 等成员变量 大量使用其原子类,减少锁的应用,从而降低频繁使用同步锁带来的性能下降。

线程安全类的应用:

并发编程包中,以下四类:

1 线程池Executor Framework 以及定时任务相关的类库,包括Timer等。

2 并发集合, 包括list,queue,map 和 set 等

3 新的同步器, 例如 读写锁 ReadWriteLock等

4 新的原子包装类, 例如 AtomicInteger等

JDK的线程安全容器 底层采用了CAS,volatile 和 ReadWriteLock 实现,相比于传统重量级的同步锁,采用了 更轻量,细粒度的锁, 因此,性能会更高。 

猜你喜欢

转载自blog.csdn.net/tuyf_hs/article/details/88577686
今日推荐