写点什么

源码分析 -Netty:多线程在 Netty 中的应用

发布于: 2021 年 03 月 13 日
源码分析 -Netty:多线程在Netty中的应用

系列文章:

源码分析 -Netty:开篇


一 Netty 线程模型


需要注意的是,Netty 的线程模型并非固定不变,而是取决于用户的启动参数配置。通过启动参数的设置,Netty 可以支持 Reactor 单线程模型和多线程模型。

二 Java 内存模型与多线程

2.1 Java 内存模型(JMM)

Java 的内存模型 JMM,我们在并发编程艺术相关文章中有过详细的阐述。感兴趣的可以回顾文章:【并发编程的艺术】Java 内存模型总结。简单来说,JVM 规范定义了 Java 内存模型,来屏蔽各种操作系统、虚拟机实现厂商和硬件的内存访问差异,从而确保 Java 程序在所有操作系统和平台上能够实现相同的效果。

2.2 多线程

并发,是高性能编程中一个重要概念。也可以通过单进程-单线程模型,在机器上启动多个进程来实现多任务并行执行。也可以像在 Java 中,通过单进程-多线程模型来执行多任务并发处理。

线程,作为调度执行单元,比进程更加轻量。可以把进程的资源分配和调度执行分开,一个进程下的多各线程可以共享内存、I/O 等操作系统资源,同时能被操作系统发起的内核线程或进程执行各线程可以独立启动、运行、停止,实现任务的拆分解耦。

线程的主要实现方式,在主流操作系统中有以下三种:

1)内核线程(KLT)实现,内核完成线程切换。系统内核通过线程调度器对线程进行调度,并负责将线程任务映射到不同的处理器上;

2)用户线城市先(UT)。通常,用户线程是指完全建立在用户空间线程库上的线程。用户线程的创建、启动、运行、销毁、切换都是在用户态完成的,不需要内核帮助。相应的,执行型能更高。

3)混合实现,将内核线程和用户线程混合在一起使用。

三 Netty 的并发编程实践

Netty 对并发编程的实践,主要包括以下几个核心内容:

3.1 对共享变量进行正确同步

3.2 正确使用锁

3.3 volatile 的正确使用

3.4 CAS 指令和原子类

3.5 线程安全类的使用——java.util.concurrent 包

3.6 读写锁的应用

3.7 线程安全性文档说明

3.8 不要依赖线程优先级

当有多个线程同时运行的时候,线程是否执行、等待,以及线程切换的时间点是由线程调度器来决定的。由于各个操作系统的线程调度器实现相差很大,所以依赖 JDK 自带的线程优先级来设置线程优先级策略的方法,是不可靠的。所以,切记程序不能依赖 JDK 中自带的线程优先级来试图保证执行顺序、比例和策略。

四 总结

本篇主要介绍 Java 内存模型和多线程相关概念,以及 Netty 的并发编程实践。下篇内容,将会结合源码进行详细阐述。

发布于: 2021 年 03 月 13 日阅读数: 34
用户头像

磨炼中成长,痛苦中前行 2017.10.22 加入

微信公众号【程序员架构进阶】。多年项目实践,架构设计经验。曲折中向前,分享经验和教训

评论

发布
暂无评论
源码分析 -Netty:多线程在Netty中的应用