Java NIO学习笔记
印象中,我对于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学习笔记相关推荐
- Java NIO 学习笔记(三)----Selector
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO学习笔记之图解ByteBuffer
转载自 Java NIO学习笔记之图解ByteBuffer ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰. <程序员的思维修炼>一本书讲过,主动学习,要 ...
- Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java nio 学习笔记 相关知识
http://blog.csdn.net/tsyj810883979/article/details/6876594 一.基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. ...
- Java NIO学习笔记 三 散点/收集 和频道转换
Java NIO散点/收集 Java NIO带有内置的分散/收集支持.散点/收集是读取和写入渠道过程中使用的概念. 从通道散射读取是将数据读入多个缓冲区的读取操作.因此,数据可以从通道"散布 ...
- Java NIO 学习笔记 缓冲区补充
1.缓冲区分配 方法 以 ByteBuffer 为例 (1)使用静态方法 ByteBuffer buffer = ByteBuffer.allocate( 500 ); allocate() 方法 ...
- java nio 学习笔记2
直接缓冲区和非直接缓冲区 这里主要想讲讲直接和非直接缓冲区的区别 1.简单介绍 直接缓冲区:在jvm中,字节数组可能不会在内存数组中连续储存,而gc也有可能随时移动这个数组的内存地址.而同时在java ...
- Java NIO学习笔记三------Chanel的四种实现篇
FileChannel FileChannel是什么 FileChannel是一个连接到文件的通道,可以通过文件通道读写文件.它无法设置为非阻塞模式,总是运行在阻塞模式下. 打开FileChannel ...
- java多线程学习笔记。
java多线程学习笔记 线程的优缺点: 多线程的好处: 充分利用多处理核心,提高资源的利用率和吞吐量. 提高接口的响应效率,异步系统工作. 线程的风险: 安全危险(竞争条件):什么坏事都没有发生.在没 ...
最新文章
- 成功解决UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xd3 in position 238: invalid continuation b
- java scanner怎么用_Java Scanner delimiter()用法及代码示例
- 并发编程——进程——进程的同步与数据共享
- 【实战】Spring生成beanName冲突的解决之道:附源码分析
- py导入包异常跳出_python~异常处理及包
- c语言程序设计基础的考试题,c语言程序设计基础的考试题.doc
- Java面试必问!Spring事务扩展机制(2)
- ajax的两个重要参数contentType 和dataType
- 数论基础——素数判断约数枚举整数分解(模板)
- c语言二级考试报名费,c语言二级考试(计算机二级c语言报名)
- 自然语言处理中的预训练模型-邱锡鹏老师
- xshell卸载注册表删除问题
- 音视频中的码率控制(CBR、VBR、CVBR、FIXQP)
- 淘宝自动回复机器人配置手册——利用旺旺分流针对性配置
- Chrome浏览器及调试教程
- 海康SDK的NET_DVR_GET_FTPCFG_V40
- java怎么查看jdk版本_java版本和jdk版本必须一样
- ubuntu conda 更新、下载模块包权限问题 'Permission denied'
- TB级别分布式关系型数据库OceanBase理论详解
- [小说]魔王冢(17)鬼金羊