印象中,我对于NIO的学习,最早是来源于一次面试,面试官问我:“可不可以讲一下Netty的线程模型?”。当然了,这个问题没答上来,于是回去后就开始搜Netty的资料,了解Netty是干什么的,用在哪些场景,Netty的原理和模型是什么…

当我查了大量的博客和文章之后,发现还是很模糊,就像是知道计算机是怎么用的,但是为什么可以这么用,是怎么做到的,还是没有很清晰形象的解释,总是看了就忘,然后再回头来看。于是,就想着从底层去学习下。而Netty是在NIO的基础上实现的网络通信框架,那么就从NIO开始研究吧!

Java NIO( New Input / Output)是Jdk1.4 加入的新特性,最开始是相对于Jdk1.4之前的Java IO(Input / Output)来讲的,是一种新的IO操作方式,于是就有了“NIO”这个名字,当然,后面很多人把它定义为非阻塞式IO(No Bloking IO),具体的定义可以自行查看百科和官方解释。

而要学习Java NIO,还需要一些知识的铺垫,这样能够帮助我们更好的理解它。这是一个开源的世界,为了尊重原创,就不再照搬和重复造轮子,仅整理下个人认为写的比较好的文章推荐给大家,不必再花力气去找资料。

一、UNIX 5种IO模型

《UNIX 5种IO模型,推荐阅读此篇》,我找到的最早的文章是CSDN的一篇博客,叫《UNIX下5种IO模型》,不过简书的那版排版更好一点,也加入了作者自己的一些理解,推荐前一篇。

在此,解释下文章中的几个迷惑知识点:

1.  同步/异步和阻塞/非阻塞

阻塞/非阻塞,是基于用户线程来定义的;同步/异步,是基于数据Copy来讲的。

阻塞,是指用户线程在发起IO操作请求后,用户线程被挂起,需一直等待数据copy完成后返回。

非阻塞,是指发起IO操作请求后,内核会立马返回收到请求,这个时候用户线程可以去干其他事了,等数据准备完成后,内核会通知用户线程,然后用户线程再发起数据Copy的动作。

同步,是指内核将数据从磁盘Copy到内核空间后,会通知用户线程,然后由用户线程发起请求,从内核空间Copy到用户线程空间。

异步,是指内核将数据从磁盘Copy到内核空间后,不通知用户线程,自动将数据Copy到用户线程空间,然后再通知用户线程,事情已经做完了。

在实际运用中,只存在同步阻塞、同步非阻塞、异步,对于异步来讲,不存在异步阻塞的概念,这只是概念混淆,就好比是,明明可以走直线,非得绕一大圈,没有意义!

在这里,再补充一个概念,《零拷贝》,减少了上下文切换,性能提升很高。

二、Java 多线程

这块要掌握进程、线程、线程池、锁和线程安全相关的知识。

《JVM内存模型》  《Java多线程》  《线程池的使用》 《锁》  《线程安全》

三、Java IO

看了很多文章,推荐一篇写的比较详细的 《Java IO 概述》。

纠正里面一个书写错误,3.5.3部分 FileInputStream(文件  字符  字节流)或FileReader(文件字节字符流)

四、Java NIO

系列篇,接上一篇  《Java NIO详解一》《Java NIO详解二》

后续有新的理解会继续补充,欢迎留言共同学习。

Java NIO学习笔记相关推荐

  1. Java NIO 学习笔记(三)----Selector

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  2. Java NIO学习笔记之图解ByteBuffer

    转载自 Java NIO学习笔记之图解ByteBuffer ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰. <程序员的思维修炼>一本书讲过,主动学习,要 ...

  3. Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  4. Java nio 学习笔记 相关知识

    http://blog.csdn.net/tsyj810883979/article/details/6876594 一.基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. ...

  5. Java NIO学习笔记 三 散点/收集 和频道转换

    Java NIO散点/收集 Java NIO带有内置的分散/收集支持.散点/收集是读取和写入渠道过程中使用的概念. 从通道散射读取是将数据读入多个缓冲区的读取操作.因此,数据可以从通道"散布 ...

  6. Java NIO 学习笔记 缓冲区补充

    1.缓冲区分配 方法   以 ByteBuffer 为例 (1)使用静态方法 ByteBuffer buffer = ByteBuffer.allocate( 500 ); allocate() 方法 ...

  7. java nio 学习笔记2

    直接缓冲区和非直接缓冲区 这里主要想讲讲直接和非直接缓冲区的区别 1.简单介绍 直接缓冲区:在jvm中,字节数组可能不会在内存数组中连续储存,而gc也有可能随时移动这个数组的内存地址.而同时在java ...

  8. Java NIO学习笔记三------Chanel的四种实现篇

    FileChannel FileChannel是什么 FileChannel是一个连接到文件的通道,可以通过文件通道读写文件.它无法设置为非阻塞模式,总是运行在阻塞模式下. 打开FileChannel ...

  9. java多线程学习笔记。

    java多线程学习笔记 线程的优缺点: 多线程的好处: 充分利用多处理核心,提高资源的利用率和吞吐量. 提高接口的响应效率,异步系统工作. 线程的风险: 安全危险(竞争条件):什么坏事都没有发生.在没 ...

最新文章

  1. 成功解决UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xd3 in position 238: invalid continuation b
  2. java scanner怎么用_Java Scanner delimiter()用法及代码示例
  3. 并发编程——进程——进程的同步与数据共享
  4. 【实战】Spring生成beanName冲突的解决之道:附源码分析
  5. py导入包异常跳出_python~异常处理及包
  6. c语言程序设计基础的考试题,c语言程序设计基础的考试题.doc
  7. Java面试必问!Spring事务扩展机制(2)
  8. ajax的两个重要参数contentType 和dataType
  9. 数论基础——素数判断约数枚举整数分解(模板)
  10. c语言二级考试报名费,c语言二级考试(计算机二级c语言报名)
  11. 自然语言处理中的预训练模型-邱锡鹏老师
  12. xshell卸载注册表删除问题
  13. 音视频中的码率控制(CBR、VBR、CVBR、FIXQP)
  14. 淘宝自动回复机器人配置手册——利用旺旺分流针对性配置
  15. Chrome浏览器及调试教程
  16. 海康SDK的NET_DVR_GET_FTPCFG_V40
  17. java怎么查看jdk版本_java版本和jdk版本必须一样
  18. ubuntu conda 更新、下载模块包权限问题 'Permission denied'
  19. TB级别分布式关系型数据库OceanBase理论详解
  20. [小说]魔王冢(17)鬼金羊

热门文章

  1. 【Python基础】面向对象封装 案例(二)
  2. 2021期末学期总结
  3. Ibatis 整合spring + Struts2 加入OSCACHE
  4. mac os mysql 命令行_macos - 在Mac OS Lion上从命令行启动MySQL服务器
  5. 还在用space键输入空格吗?快来使用转义符吧
  6. 基于物联网的智能盆栽自动喷灌系统
  7. laravel邮箱找回密码
  8. lunix安装tornado
  9. 2015061908 - 人来人往
  10. [附源码]Python计算机毕业设计SSM泸定中学宿舍管理系统设计(程序+LW)