JAVA NIO 简介

一. 同步与异步, 阻塞与非阻塞

同步与异步

  同步与异步是相对应,是针对两个线程说的,两个线程要么是同步的,要么是异步的。
  举个栗子:假设 A B是两个线程, A 调用 B。
  如果是 同步的,那么 A必须等待 B 返回之后再去做其它的事情, 假设 B 是个 IO 操作,那么 CPU 此时就是闲置的;
  如果是 异步 的,A 调用 B 后,不用等待 B 完成, A 就可以直接返回,此时 A 可以继续利用 CPU资源。 如果 A关注 B 的结果,等 B 完成后可以通过状态或事件通知 A。
  同步/异步IO
指的是应用程序和操作系统之间的同步,当操作系统接收到应用程序的IO请求后, 判断数据是否已经准备好。 如果没有准备好, 同步IO下,操作系统不响应,直到数据准备好; 异步IO下, 会先返回个标记, 等数据准备好后,再用事件机制返回给应用程序。

阻塞与非阻塞

   阻塞与非阻塞是对用一个线程来说的,这个线程要么处于阻塞状态,要么处于非阻塞状态。应用程序的一次 IO操作一般氛围两部分,1. 将硬盘(或网络)的数据拷贝到内核空间(kernel space)。 2. 将内核空间的数据拷贝到应用程序空间。 阻塞与非阻塞就是指在这两个数据准备的过程中 ,线程是否是阻塞的。

  阻塞/非阻塞IO
指的是引用程序本身是否阻塞,应用程序(线程)在请求操作系统IO资源后, 如果IO资源没有准备好, 阻塞IO下, 程序会等待;非阻塞IO下, 程序(线程)会去做其它事,并使用线程一直轮询,知道IO资源准备好。

  如何理解同步与阻塞,异步与非阻塞呢.
  同步异步、阻塞非阻塞这两组形容词描述的东西不同。同步与异步说的是实现机制, 阻塞与非阻塞说的是线程状态。 阻塞就是一种同步机制的结果,非阻塞则是异步机制的结果。

  JAVA NIO 是非阻塞的 IO, 但是通常大家认为它是同步的非阻塞 IO。为什么呢?因为线程本身是非阻塞的,而程序与操作系统之间的交互是同步的。

二. JAVA NIO 介绍

NIO 的8点优势
  1. 面向channel和 NIO buffer 的数据流 IO 操作与传统 IO 相比,有更快的执行速度和更好的性能。同时NIO将操作系统用于传统的I / O任务,这再次使其更加高效。
  2. NIO和传统IO之间的另一个区别是,传统IO使用的线性流数据,每次处理一个或多个字节,依赖于将数据对象转换为字节,反之亦然。 而NIO处理的是包含大量字节的数据块。
  3. 传统 IO 是单项通信,要么读要么写。而 NIO的 channel 可以是双向通信,可以既负责读又负责写
  4. 传统IO中的线性数据流不允许在数据中前后移动。如果需要在从流中读取的数据前后移动需要先将其缓存在缓冲区中。而在NIO的情况下,我们使用缓冲,它允许前后移动访问数据而无需缓存,提供了更大的灵活性。
  5. NIO API还支持多线程,以便可以异步读取和写入数据,例如在执行IO操作时不阻塞当前线程。这再次使其比传统的Java IO API更有效。
  6. NIO 通过 selectors引入了多线程的概念, selectors可以用异步或非阻塞的方式监听多个channel 的 IO 事件。
  7. NIO的非阻塞的意思是:只有当数据准备好时(可用)才请求线程读或写。否则线程可以被用于其它任务以降低整体的执行时间。而这对于传统 IO 是不可能的,传统 IO 是不支持多线程的,这也注定传统 IO 是阻塞的。
  8. NIO允许仅使用单个线程来管理多个通道,但是这可能使解析NIO的数据比解析从传统 IO阻塞数据流中读取的数据更复杂一点点。因此,如果是连接数较少带宽较大,并且一次发送的数据比较多, 这种情况下传统 IO会比 NIO 更适合。

**总结一下:NIO是面向 buffer和 channel的,本身性能就更好。并且支持 selector,可以让一个线程管理多个 channel。 NIO的非阻塞本质上也是通过多线程异步实现。 **

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值