源码分析 -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 的并发编程实践。下篇内容,将会结合源码进行详细阐述。
版权声明: 本文为 InfoQ 作者【程序员架构进阶】的原创文章。
原文链接:【http://xie.infoq.cn/article/828d3051b46d49bae8ba067f0】。文章转载请联系作者。
评论