美文网首页软件开发
为什么java nio被称为同步非阻塞io?

为什么java nio被称为同步非阻塞io?

作者: 宸小朔 | 来源:发表于2019-07-05 09:29 被阅读0次

概述

​ java nio可以被称为java new io,因为其提供了一种有别于传统java io的io工作方式。同时,由于java nio是同步非阻塞的,其也被称为non-blocking io(非阻塞io)。但是,为什么java nio是同步非阻塞的?本文将对这个问题进行深入的解析。

概念解析

​ 在对本文的问题进行分析之前,我们先看下同步异步,阻塞非则塞者两对概念。

(1)同步和异步

​ 同步和异步描述的是一种消息通知的机制,主动等待消息返回还是被动接受消息。同步io指的是调用方通过主动等待获取调用返回的结果来获取消息通知,而异步io指的是被调用方通过某种方式(如,回调函数)来通知调用方获取消息。

(2)阻塞非阻塞

​ 阻塞和非阻塞描述的是调用方在获取消息过程中的状态,阻塞等待还是立刻返回。阻塞io指的是调用方在获取消息的过程中会挂起阻塞,知道获取到消息,而非阻塞io指的是调用方在获取io的过程中会立刻返回而不进行挂起。

为什么java nio是同步非阻塞的?

​ 我们知道java nio是基于io多路复用模型,也就是我们经常提到的select,poll,epoll。io 多路复用本质是同步io,其需要调用方在读写事件就绪时主动去进行读写。在java nio中,通过selector来获取就绪的事件,当selector上监听的channel中没有就绪的读写时间时,其可以直接返回,或者设置一段超时后返回。可以看出java nio可以实现非则塞,而不像传统io里必须则塞当前线程直到可读或可写。所以,java nio可以实现非阻塞。我们简单看下java nio处理连接和java socket 处理连接的方式:

//java nio
while(true) {
  ......
  selector.select(1);
  Set<SelectionKey> selectionKeySet= selector.selectedKeys();
  ......
  //处理selectionKeySet中事件,线程没有阻塞
}

//java socket处理连接,线程会阻塞
while(true) {
  ......
  Socket socket = serverSocket.accept();
  InputStream in = socket.getInputStream(); 
  ......
  //处理in中内容
}

​ 本文篇幅很短,只是为了说明本人最近的疑虑,因为之前我一直觉得java nio也是阻塞的。希望本文可以对有相似疑虑的同学有所帮助,共同成长!

原文

袁琼琼的技术博客,欢迎指针
http://yuanqiongqiong.cn/2019/07/04/%E4%B8%BA%E4%BB%80%E4%B9%88java-nio%E8%A2%AB%E7%A7%B0%E4%B8%BA%E5%90%8C%E6%AD%A5%E9%9D%9E%E9%98%BB%E5%A1%9Eio/

相关文章

  • java IO、NIO、AIO

    IO流(同步、阻塞) 、 NIO(同步、非阻塞) 、 NIO2(异步、非阻塞) 概述在我们学习Java的IO流之前...

  • Java Socket IO演进(一)-BIO/NIO/AIO

    1. 概览 Java中主要有三种IO模型,分别是同步阻塞IO(BIO)、同步非阻塞IO(NIO)、异步非阻塞IO(...

  • Java - 网络IO

    发展历程 Java1.0开始提供的IO都同步阻塞IO,即BIO。Java1.4开始提供了同步非阻塞IO,即NIO。...

  • 分布式理论架构设计

    IO模型 BIO 同步阻塞 NIO 同步非阻塞 AIO 异步非阻塞 NIO核心组件 Selector Channe...

  • netty(一)nio基础

    NIO,Non-Block IO ,从 Java 1.4 版本开始引入的非阻塞 IO ,是一种非阻塞 + 同步的通...

  • I/O详解之BIO,NIO,AIO概念

    IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 1.IO场景 同步阻塞IO(B...

  • Netty基础-JAVA IO模型

    java - IO模型 BIO NIO AIO 同步与异步,阻塞与非阻塞 同步与异步是面向多个线程协作的情况。 假...

  • 为什么java nio被称为同步非阻塞io?

    概述 ​ java nio可以被称为java new io,因为其提供了一种有别于传统java io的...

  • NIO编程

    一、什么是NIO? Java NIO 全称:NoneBlocking IO,非阻塞IO;从Java 1.4提供区...

  • Java IO 学习(一)同步/异步/阻塞/非阻塞

    关于IO,同步/异步/阻塞/非阻塞,这几个关键词是经常听到的,譬如:“Java oio是阻塞的,nio是非阻塞的”...

网友评论

    本文标题:为什么java nio被称为同步非阻塞io?

    本文链接:https://www.haomeiwen.com/subject/aktshctx.html