Java NIO事件驱动模型详解:从Selector到SelectionKey的完整链路剖析

第一章:Java NIO事件驱动模型概述

Java NIO(New I/O)是 JDK 1.4 引入的一套非阻塞 I/O API,它为构建高性能、可扩展的网络应用提供了基础支持。其核心在于事件驱动模型,通过选择器(Selector)、通道(Channel)和缓冲区(Buffer)三者协同工作,实现单线程管理多个客户端连接。

事件驱动的核心组件

  • Channel:双向数据通道,如 SocketChannel 和 ServerSocketChannel,支持非阻塞读写
  • Buffer:数据容器,常见的有 ByteBuffer,用于暂存读写的数据
  • Selector:监听多个通道上的事件(如 OP_READ、OP_WRITE),实现单线程轮询就绪事件

事件注册与处理流程

当通道被配置为非阻塞模式后,可将其注册到选择器上,并指定感兴趣的事件类型。选择器通过 select() 方法阻塞等待至少一个事件就绪,随后可通过 selectedKeys() 获取就绪事件集合进行处理。
// 示例:注册通道到选择器
Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
serverChannel.register(selector, SelectionKey.OP_ACCEPT); // 注册接收连接事件

while (true) {
    int readyChannels = selector.select(); // 阻塞直到有事件就绪
    if (readyChannels == 0) continue;

    Set<SelectionKey> selectedKeys = selector.selectedKeys();
    Iterator<SelectionKey> keyIterator = selectedKeys.iterator();

    while (keyIterator.hasNext()) {
        SelectionKey key = keyIterator.next();
        if (key.isAcceptable()) {
            // 处理新连接
        } else if (key.isReadable()) {
            // 处理读操作
        }
        keyIterator.remove(); // 必须手动移除已处理的键
    }
}
事件常量含义
OP_ACCEPT有新的客户端连接请求
OP_CONNECT连接已建立(客户端)
OP_READ通道中有可读数据
OP_WRITE通道可以写入数据
graph TD A[客户端请求] --> B{ServerSocketChannel} B --> C[注册OP_ACCEPT] C --> D[Selector监听] D --> E[事件就绪] E --> F[接受连接并注册OP_READ] F --> G[读取数据]

第二章:Selector的核心机制与工作原理

2.1 Selector的创建与初始化流程

Selector 是 NIO 的核心组件之一,负责监控多个通道的就绪事件。其创建通常通过静态工厂方法实现。
Selector selector = Selector.open();
该代码调用底层系统资源初始化多路复用器。`open()` 方法会根据操作系统自动选择合适的 SelectorProvider,如在 Linux 上默认使用 epoll 实现。
初始化关键步骤
  • 加载平台默认的 SelectorProvider
  • 分配内部数据结构(如键集合、已就绪通道队列)
  • 绑定系统级事件通知机制(如 epoll_create)
内部状态管理
组件作用
SelectionKey Set存储注册的监听关系
SelectedKeys记录已就绪的事件

2.2 多路复用器的底层实现原理剖析

多路复用器(Multiplexer)在操作系统和网络编程中扮演核心角色,其本质是通过单一控制流管理多个I/O通道。底层依赖于内核提供的系统调用,如 `select`、`poll` 和 `epoll`。
事件驱动机制
以 Linux 的 `epoll` 为例,其通过红黑树维护文件描述符集合,提升增删查效率。当调用 epoll_wait 时,内核仅返回就绪的描述符,避免轮询开销。

int epoll_fd = epoll_create1(0);
struct epoll_event event, events[MAX_EVENTS];
event.events = EPOLLIN;
event.data.fd = sockfd;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sockfd, &event);
int n = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
上述代码注册 socket 到 epoll 实例,并等待事件到达。其中 events 数组接收就绪事件,epoll_wait 在无事件时阻塞,实现高效挂起。
性能对比
机制时间复杂度最大连接数
selectO(n)1024
epollO(1)百万级

2.3 事件轮询机制:select()方法深度解析

在Go语言的并发模型中,select语句是实现通道通信调度的核心机制。它类似于操作系统中的多路复用,能够监听多个通道的操作状态,并在其中一个就绪时执行对应分支。
基本语法结构
select {
case msg1 := <-ch1:
    fmt.Println("收到ch1消息:", msg1)
case ch2 <- "data":
    fmt.Println("向ch2发送数据")
default:
    fmt.Println("无就绪操作,执行默认分支")
}
上述代码展示了select监听接收与发送操作的典型用法。每个case代表一个通道通信操作,运行时会随机选择一个就绪的可通信分支执行。
执行优先级规则
  • 若有任意case通道已就绪,则随机选择一个执行
  • 若多个case同时就绪,Go运行时随机选择,避免饥饿
  • 未设置default时,select会阻塞直至某个case就绪
  • default存在则提供非阻塞语义,立即返回

2.4 唤醒机制与并发控制策略分析

在高并发系统中,线程的唤醒机制与资源竞争控制直接影响系统性能与稳定性。合理的并发策略可避免资源争用、死锁及惊群效应。
条件变量与信号唤醒
常用条件变量实现线程阻塞与唤醒,如下为 Go 语言示例:
c := sync.NewCond(&sync.Mutex{})
c.L.Lock()
for !condition {
    c.Wait() // 释放锁并等待唤醒
}
// 执行临界区操作
c.L.Unlock()
c.Signal() // 唤醒一个等待者
Wait() 内部自动释放锁并挂起线程,Signal() 触发单个线程恢复,确保唤醒精准性。
并发控制策略对比
策略适用场景优缺点
互斥锁临界资源保护简单但易成瓶颈
读写锁读多写少提升并发读性能
信号量资源池管理控制并发数量

2.5 实践:构建可扩展的非阻塞服务端框架

在高并发场景下,传统阻塞式 I/O 架构难以满足性能需求。采用非阻塞 I/O 与事件驱动模型是提升服务端可扩展性的关键。
核心架构设计
使用 Reactor 模式解耦事件监听与业务处理,通过单线程或多线程事件循环高效管理成千上万连接。
基于 Go 的实现示例
func startServer() {
    listener, _ := net.Listen("tcp", ":8080")
    for {
        conn, _ := listener.Accept()
        go handleConn(conn) // 非阻塞地启动协程处理
    }
}
上述代码利用 Go 的轻量级 goroutine 实现每个连接独立处理,避免线程阻塞。`Accept()` 在监听套接字上非阻塞等待新连接,一旦建立立即交由协程处理,主循环继续监听。
  • 事件驱动:通过 I/O 多路复用(如 epoll)监控多个连接状态变化
  • 零拷贝:利用 mmap 或 sendfile 减少数据在内核态与用户态间的复制开销

第三章:SelectionKey的关键角色与状态管理

3.1 SelectionKey的生命周期与四种就绪事件

SelectionKey 是 Java NIO 中连接 Channel 与 Selector 的核心纽带,其生命周期始于 Channel 注册到 Selector 时,终于被显式取消并从 Selector 中移除。
就绪事件类型
SelectionKey 支持四种就绪状态,通过位掩码表示:
  • OP_READ:通道可读数据
  • OP_WRITE:通道可写数据
  • OP_CONNECT:连接建立完成(如 SocketChannel)
  • OP_ACCEPT:可接受新连接(如 ServerSocketChannel)
事件监听示例
SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
if (key.isReadable()) {
    // 处理读操作
    SocketChannel ch = (SocketChannel) key.channel();
    ByteBuffer buffer = (ByteBuffer) key.attachment();
    ch.read(buffer);
}
上述代码注册通道并监听读事件。当 Selector 检测到就绪时,可通过 isReadable() 判断状态,channel() 获取关联通道,attachment() 获取附加对象,实现事件驱动的数据处理。

3.2 关键属性解读:附件、兴趣集与就绪集

在事件驱动系统中,**附件(Attachments)**、**兴趣集(Interest Set)** 和 **就绪集(Ready Set)** 是构建高效 I/O 多路复用机制的核心属性。
附件:携带上下文信息
附件允许将自定义对象绑定到通道上,常用于传递处理器或状态信息。
selectionKey.attach(new ChannelHandler());
ChannelHandler handler = (ChannelHandler) selectionKey.attachment();
上述代码将业务处理器附加到选择键,便于后续事件处理时调用。
兴趣集与就绪集的协作机制
兴趣集定义通道关注的事件类型,如 OP_READ 或 OP_WRITE;就绪集则表示当前已就绪可执行的操作。
  • OP_READ:输入数据可读
  • OP_WRITE:通道可写
  • OP_CONNECT:连接建立完成
  • OP_ACCEPT:可接受新连接
通过轮询选择键并检查就绪集,系统能精准响应实际发生的 I/O 事件,避免无效操作。

3.3 实践:利用SelectionKey实现事件精准分发

在NIO编程中,SelectionKey是连接Channel与Selector的核心纽带。通过其绑定的事件掩码,可精确识别就绪事件类型,实现高效分发。
事件类型与位掩码
SelectionKey定义了四种标准事件:
  • OP_READ:通道可读
  • OP_WRITE:通道可写
  • OP_CONNECT:连接建立完成
  • OP_ACCEPT:可接受新连接
事件分发代码示例
while (selector.select() > 0) {
    Iterator<SelectionKey> it = selector.selectedKeys().iterator();
    while (it.hasNext()) {
        SelectionKey key = it.next();
        if (key.isAcceptable()) {
            // 处理新连接
        } else if (key.isReadable()) {
            // 读取客户端数据
        }
        it.remove();
    }
}
上述代码通过isXXX()方法判断具体就绪事件,确保每个Channel只处理其准备好的操作,避免资源浪费。结合attach()方法可绑定处理器对象,进一步实现职责分离与逻辑解耦。

第四章:事件处理链路的完整贯通

4.1 通道注册与事件监听的绑定过程

在事件驱动架构中,通道(Channel)注册是实现异步通信的关键步骤。当一个通道被创建后,必须将其注册到事件循环(EventLoop)中,以便监听特定的I/O事件。
注册流程解析
通道通过调用 register() 方法绑定到选择器(Selector),并指定感兴趣的事件类型,如读、写或连接。

channel.register(selector, SelectionKey.OP_READ, attachment);
上述代码将通道注册到选择器,监听读事件,并附加一个状态对象。参数说明:第一个参数为选择器实例;第二个为事件掩码;第三个为可选的附件,常用于上下文传递。
事件监听绑定机制
注册后,选择器会监控该通道的就绪状态。当底层I/O事件触发时,对应的选择键(SelectionKey)进入就绪态,事件循环即可通过轮询获取并分发处理。
  • OP_READ:数据可读
  • OP_WRITE:可写入数据
  • OP_CONNECT:连接建立完成
  • OP_ACCEPT:可接受新连接

4.2 就绪事件的检测与提取流程

在I/O多路复用机制中,就绪事件的检测与提取是核心环节。系统通过内核态的事件表监控文件描述符状态变化,当某个连接上有数据可读或可写时,触发就绪通知。
事件检测流程
  • 调用epoll_wait进入阻塞等待状态
  • 内核遍历就绪链表,将活跃的文件描述符拷贝至用户空间
  • 返回就绪事件数量,供应用程序逐个处理
代码实现示例

// 等待事件就绪
int n = epoll_wait(epfd, events, MAX_EVENTS, -1);
for (int i = 0; i < n; ++i) {
    if (events[i].events & EPOLLIN) {
        handle_read(events[i].data.fd);
    }
}
上述代码中,epoll_wait阻塞直到有事件就绪;events数组接收就绪事件,每个元素包含fd和对应事件类型。程序根据EPOLLIN标志判断是否可读,进而分发处理逻辑。

4.3 读写事件的响应与缓冲区协同处理

在I/O多路复用系统中,读写事件的响应效率直接影响整体性能。当文件描述符就绪时,内核通知用户态程序进行数据读取或写入操作,此时需与用户空间的缓冲区协同工作。
事件驱动的数据流转
读事件触发后,应立即将数据从内核缓冲区读取至应用层接收缓冲区,避免数据丢失;写事件则表示发送缓冲区已腾出空间,可将待发送数据写入。
// 示例:非阻塞Socket读取处理
n, err := conn.Read(buf)
if err == nil && n > 0 {
    writeBuffer.Write(buf[:n]) // 写入输出缓冲
}
上述代码中,conn.Read 尝试读取数据至 buf,成功后将有效数据写入输出缓冲区,实现读写联动。
缓冲区管理策略
  • 动态扩容:根据流量负载自动调整缓冲区大小
  • 双缓冲机制:读写操作使用独立缓冲,减少竞争
  • 零拷贝优化:通过 mmap 或 sendfile 减少内存复制开销

4.4 实践:高并发场景下的事件驱动通信实例

在高并发系统中,事件驱动架构能显著提升通信效率与系统响应能力。通过异步消息机制解耦服务组件,可实现非阻塞处理大量并发请求。
核心设计模式
采用发布-订阅模型,结合消息队列(如Kafka)实现事件分发。每个服务监听特定事件,触发对应业务逻辑。
  • 事件生产者生成订单创建事件
  • 消息中间件进行异步投递
  • 消费者服务接收并处理积分、通知等后续动作
// Go语言示例:使用NATS发布事件
import "github.com/nats-io/nats.go"

nc, _ := nats.Connect("localhost:4222")
defer nc.Close()

// 发布订单创建事件
nc.Publish("order.created", []byte(`{"order_id": "123", "amount": 99.5}`))
上述代码通过NATS客户端连接服务器,并向order.created主题发布JSON格式事件。参数包括订单ID和金额,供下游服务消费处理。
性能对比
架构类型吞吐量(TPS)平均延迟
同步调用85045ms
事件驱动320012ms

第五章:总结与性能优化建议

避免频繁的垃圾回收压力
在高并发服务中,对象频繁创建会加剧 GC 压力。建议复用临时对象,使用 sync.Pool 缓解堆分配压力:

var bufferPool = sync.Pool{
    New: func() interface{} {
        return make([]byte, 1024)
    },
}

func process(data []byte) {
    buf := bufferPool.Get().([]byte)
    defer bufferPool.Put(buf)
    // 使用 buf 进行处理
}
数据库连接与查询优化
长时间未关闭的连接会导致连接池耗尽。合理设置最大空闲连接数和超时时间至关重要:
  • 设置连接的最大生命周期(max lifetime)防止陈旧连接
  • 使用预编译语句减少 SQL 解析开销
  • 对高频查询字段建立复合索引
例如,在 MySQL 中添加索引提升查询效率:

ALTER TABLE orders ADD INDEX idx_status_user (status, user_id);
异步处理降低响应延迟
将非核心逻辑(如日志记录、通知发送)移出主调用链,可显著提升接口吞吐量。推荐使用轻量级协程队列:
方案适用场景延迟
Goroutine + Channel内部服务解耦<10ms
Kafka 消息队列跨服务事件分发~50ms
监控与调优闭环
通过 Prometheus + Grafana 实现 QPS、P99 延迟、GC Pause 的可视化监控,设定告警阈值。定期执行 pprof 分析内存与 CPU 热点路径,定位性能瓶颈。
I/O多路复用与异步I/O原理深度解析:从BIO到epoll再到AIO I/O模型是高并发系统性能的底层基石,其本质是解决CPU与慢速设备(如网络、磁盘)之间的效率失配问题。阻塞I/O(BIO)依赖线程独占等待,导致资源爆炸;I/O多路复用(如epoll)通过内核事件通知机制,实现单线程高效管理海量连接,显著降低上下文切换与内存开销;异步I/O(AIO)则进一步将数据搬运全程委托内核,以回调驱动实现真正无阻塞。这些技术共同支撑了Redis、Netty、Kafka等高性能中间件的低延迟与高吞吐能力。本文结合Linux内核源码、JVM NIO实现及可验证Demo,深入剖析selec 阅读详情

相关推荐

解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。

解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。 添加getchar();代码块解决无法查找或打开PDB文件。 错误提示: “Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。 “Pro...

m0_46523403的博客 6421

java实现事件驱动

java实现一个基于事件驱动编程模式的程序

weixin_43830765的博客 2622

Windows 64 位系统下安装配置 DOSBox 及 debug.exe

该篇博客同样作为类似问题 “如何在 Windows 64 位系统下进入 debug” 的答案。 很多同学初看王爽的《汇编语言》,或者因为其它原因需要进入 debug 调试模式下学习汇编语言的时候,会发现进入不了,出现类似以下的错误提示。 这是因为他们使用的是 64 位的 Windows 系统(Win 7,Win 8 以及 Win 10 等),而 64 位 Windows 系统不再支持在命令提示符窗口下进入 debug 调试模式。那么对于使用 64 位 Windows 系统的用户来说,该怎样才能够顺利进入 d

加号减减号的博客 5万+

Java 设计模式 | 事件驱动

事件驱动是一种软件架构模式,其中程序的流程是由外部事件触发的,而不是由程序内部的控制流决定。这种模式非常适合处理用户交互、异步消息处理等场景。

m0_69146489的博客 1122

Halcon 3D视觉实战:5步将线激光高度数据转为可分析的深度图与点云

本文详细介绍了如何利用Halcon平台将线激光高度数据转换为深度图与点云的5步实战方法。通过具体代码示例和工业检测案例(如锂电池胶水测量),帮助工程师高效处理3D视觉数据,实现从原始数据到三维可视化的完整技术链路。

weixin_29039773的博客 361

ChatBI实战:如何用Vanna和WrenAI搭建企业级智能问数系统(附避坑指南)

本文详细介绍了如何利用Vanna和WrenAI搭建企业级智能问数系统(ChatBI),解决多源异构数据整合、语义理解准确率和系统性能安全等核心挑战。通过实战案例和优化策略,展示了这一组合方案在提升查询效率、实现业务自主分析和动态探索式分析方面的显著优势,特别适合企业级数据查询需求。

weixin_29047919的博客 401

Java NIO SelectionKey

SelectionKey 是 Java NIO 中用于管理通道状态和事件的关键对象。通过 SelectionKey,我们可以获取通道和选择器之间的关联关系,管理感兴趣的事件类型,判断就绪的事件类型,并附加额外的对象信息。

一起coding,一起嗨。 772

华为2288H-V5服务器做raid的详细步骤

操作步骤 服务器启动界面 按del键进入设置输入密码,2288H-v5默认密码是Admin@9000 移动光标选择device manager 驱动管理选择configurationutility 配置管理 选择main menu 主菜单 选择第一个 configuration management 配置管理 选择create virtual driver 创建虚拟驱动选择select RAID level 选择RAID等级选择level-5 选择select drivers 选择驱......

weixin_46041124的博客 1万+

Java SelectionKey虚拟类

文章目录总结SelectionKey虚拟类方法选择器、通道、键操作获取和设置兴趣集检测就绪操作添加和获取附件兴趣集(操作集) 总结 SelectionKey虚拟类表示通道SelectableChannel与选择器Selector注册的标记 每次向选择器注册通道时,都会创建一个选择键SelectionKey,在通过调用其cancel方法取消键、 关闭其通道或关闭其选择器之前,键一直有效。cancel方法取消键不会立即将其从选择器中移除,而是将其添加到选择器的取消键集合中, 以便在下一次选择操作中删除,可以通

weixin_45754452的博客 761

NRF24L01模块的5个常见问题及解决方案:从信号干扰到功耗优化

本文深入探讨NRF24L01无线模块在STM32开发中的5大常见问题及解决方案,包括通信距离优化、数据丢失排查、电源噪声抑制、SPI通信故障处理以及低功耗设计。通过代码示例和电路图分析,提供实用的优化策略,帮助开发者提升无线通信的稳定性和效率。

weixin_28256233的博客 226

AI算力网络与通信领域QoS保障的测试方法

在当今数字化时代,AI技术蓬勃发展,AI算力网络应运而生。它将分布在不同地理位置的算力资源进行整合,以高效地支持各种AI应用,如深度学习训练、智能图像识别等。而通信领域则是信息传输的基石,确保数据能够准确、快速地在不同节点之间传递。QoS保障在通信领域至关重要,它可以确保不同类型的业务(如语音通话、视频会议、在线游戏等)获得与其需求相匹配的服务质量。在AI算力网络中,QoS保障同样不可或缺,因为AI任务对网络的带宽、延迟、可靠性等指标有严格要求。

AI算力网络与通信的博客 529

java 事件驱动模型(事件发布和监听@EventListener)

Spring 容器在创建 bean 的过程中,会检查 bean 是否实现了某些特定的 Aware 接口,如果实现了,则会在合适的时机调用相应的 setter 方法,将相关的对象注入到 bean 中。本例的事件驱动模型是一种典型的观察者设计模式,它使得组件之间的解耦更为容易,也使得代码更加灵活和可扩展。1、解耦:观察者设计模式实现了观察者与被观察者之间的解耦,降低了两者之间的耦合关系。3、事件驱动:观察者设计模式基于事件驱动,当被观察者状态发生改变时,会自动通知所有注册的观察者。2、定义事件的发布方法。

weisian的博客 2万+

GD32F303标准库开发:Keil5新建GD32标准库工程

GD32F303标准库开发:Keil5新建GD32标准库工程

MQ0522的博客 8907

NIO Selector事件注册全链路剖析(亿级流量系统都在用的技术内幕)

深入解析NIO Selector 的事件注册机制,揭示高并发系统如何高效管理亿级连接。涵盖事件注册流程、OP_READ/OP_WRITE触发原理及优化策略,提升系统性能。适用于高性能网络编程场景,值得收藏。

VarFun的博客 351

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java IO演进:从BIO到NIO与Netty,掌握高并发网络编程核心

在计算机系统中,输入输出(IO)是程序与外部世界交互的基础机制,其性能直接影响应用吞吐与响应。IO模型的核心原理在于如何处理数据读写时的等待:传统阻塞IO(BIO)采用同步阻塞方式,每连接独占线程,简单但资源消耗大;而非阻塞IO(NIO)则通过多路复用器(Selector)实现同步非阻塞,单线程可监控大量通道事件,大幅提升并发能力。这一技术价值在于高效利用系统资源,支撑高并发场景,如即时通讯、游戏服务器等。随着分布式架构普及,**Netty**作为基于NIO的异步事件驱动框架,通过Reactor线程模型与P

cuyi7076的博客 526

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

NIO开发流程

NIO原理剖析 Java原生NIO开发大致流程: 第一步,绑定一个服务的端口 这与传统阻塞IO中的ServerSocket类似,没什么好说的 第二步,打开通道管理器Selector并在Selector上注册一个事件 当注册的事件发生时,Selector.select()会返回,否则一直阻塞。这一步很有意思,也是NIO第一个与传统IO不同的地方,NIO通过一个...

JinXYan的博客 808

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Xnio源码分析

Xnio是Jboss对nio的一次优秀的封装网络io框架,相信有研究过undertow源码的同学,在undertow的源码里面或多或少的都有看到xnio的身影先回忆一下前一篇博文对netty线程模型的概述,先上图:说白了:就是使用多个线程组,各自分工处理自己的事情,boss线程只负责连接事件,然后把连接好的SocketChannel交给worker线程处理。在netty中,有说过EventLoop是netty中最最重要的组件,相信在Xnio这种优秀的io框架处理上也会有惊艳的骚操作。

qq_39203337的博客 823

同步异步阻塞非阻塞BIO/NIO/AIO三维度本质解析

IO模型是后端性能的底层基石,其核心并非抽象概念,而是操作系统对数据流动的调度机制。同步与异步决定结果交付方式(调用方轮询 vs 内核回调),阻塞与非阻塞决定线程是否让出CPU(内核挂起 vs 立即返回),BIO/NIO/AIO则反映内核IO能力演进(独占线程 → 多路复用 → 全异步DMA)。这三组正交维度共同构成高并发系统的设计坐标系。理解它们,才能科学选型Netty、Tomcat或R2DBC;才能定位strace中epoll_wait耗时异常、jstack里NioEndpoint线程阻塞等真实问题;也

as2886089的博客 395

Netty源码分析篇:Channel 的 register 操作

Netty源码分析篇:Channel 的 register 操作

java_rutu的博客 1324

Spring cloud组件gateway网关详细剖析

Spring Cloud Gateway 的核心配置通常在文件中完成。spring:cloud:gateway:routes:- id: user-service-route # 路由ID,唯一# lb:// 前缀表示启用服务发现和负载均衡,userservice 为服务名predicates: # 断言:匹配 /user/ 开头的请求filters: # 过滤器:移除第一级路径前缀 /userfilters:断言工厂说明示例Path基于请求路径匹配Method匹配HTTP请求方法。

qq_39126115的博客 546

tomcat的初步学习使用

对于 StandardContext,启动过程是 Web 应用初始化的核心:- WebappLoader.start():启动 Web 应用的类加载器- Manager.start():启动 Session 管理器- filterStart():初始化所有 Filter(调用 Filter.init())- loadOnStartup():收集 web.xml 中 load-on-startup >= 0 的 Servlet,按数值从小到大排序后 依次调用 wrapper.load()。

llll_llll0xff的博客 271

Java 函数式编程与事件驱动模式

Java 函数式编程入门函数式编程实战改进   像 JavaScript 这种语言很早就支持闭包了,虽然 C++ 很早就有了函数指针,Java 也很早就提供了反射中的 Method 类,不过使用它们都不能算是真正的函数式编程(面向函数编程)。原因它们还不够方便和优雅。编程语言是为人类设计的语言,如果仅仅为了可实现,那任何编程思想、设计模式、架构模式都没有意义。   Java 从 Java 8 开始支持 lambda 表达式,这才算是支持函数式编程。函数式编程有什么好处呢?如果将其与依赖注入技术结合,可以很好

暗诺星刻的博客 2514

Java NIO学习(二)SelectionKey详解

上一篇博客中的结尾讲到将Channel注册在某个Selector的管辖范围之下: channel.register(selector, SelectionKey.OP_ACCEPT); 由这个register()方法的第二个参数SelectionKey.OP_ACCEPT,我们引出关于SelectionKey的讨论。 常量OP_ACCEPT是SelectionKey中一个重要属性Interest Set中的一个常量,Selector就是通过这个集合来监听Channel对什么事件感兴趣的,所以regi

Gabriel576282253的专栏 2082

Java中的事件驱动架构:如何实现高效的事件处理与响应

在Java中,实现事件驱动架构有多种方式,可以使用传统的观察者模式,也可以利用第三方库如Google Guava、Spring Event或Akka等。它通过事件的发布、订阅和响应,解耦了系统的各个模块,提升了系统的扩展性和灵活性。观察者模式是实现事件驱动架构的经典方法,它通过定义观察者接口和被观察者接口,解耦了事件的发布与处理。通过合理的优化和实践,可以实现高效的事件处理与响应,满足复杂业务场景的需求。Spring的事件机制具有很高的扩展性和灵活性,适合在复杂的业务场景中使用。

微赚淘客系统开发者博客 2128

Java的selectionkey_SelectionKey API 用法

java.nio.channels类 SelectionKeyjava.lang.Objectjava.nio.channels.SelectionKey直接已知子类:AbstractSelectionKeypublic abstract class SelectionKeyextends Object表示 SelectableChannel 在 Selector 中的注册的标记。每次向选择器注册...

weixin_34116482的博客 459
上一篇: CyclicBarrier初始化parties后不可变?深入JVM源码的5个真相
下一篇: 【现代C++异常安全架构】:从移动构造到智能指针的无缝保护方案
SimProceed
博客等级 码龄1年 146粉丝 2011原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值