理解 Java NIO:
http://www.open-open.com/lib/view/open1371349692734.html
同步与异步、阻塞与非阻塞 理解:
同步与异步
所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。而异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。我们可以用打电话和发短信来很好的比喻同步与异步操作。
在设计到 IO 处理时通常都会遇到一个是同步还是异步的处理方式的选择问题。因为同步与异步的 I/O 处理方式对调用者的影响很大,在数据库产品中都会遇到这个问题。因为 I/O 操作通常是一个非常耗时的操作,在一个任务序列中 I/O 通常都是性能瓶颈。但是同步与异步的处理方式对程序的可靠性影响非常大,同步能够保证程序的可靠性,而异步可以提升程序的性能,必须在可靠性和性能之间做个平衡,没有完美的解决办法。
阻塞与非阻塞
阻塞与非阻塞主要是从 CPU 的消耗上来说的,阻塞就是 CPU 停下来等待一个慢的操作完成 CPU 才接着完成其它的事。非阻塞就是在这个慢的操作在执行时 CPU 去干其它别的事,等这个慢的操作完成时,CPU 再接着完成后续的操作。虽然表面上看非阻塞的方式可以明显的提高 CPU 的利用率,但是也带了另外一种后果就是系统的线程切换增加。增加的 CPU 使用时间能不能补偿系统的切换成本需要好好评估。
两种的方式的组合
组合的方式可以由四种,分别是:同步阻塞、同步非阻塞、异步阻塞、异步非阻塞,这四种方式都对 I/O 性能有影响。下面给出分析,并有一些常用的设计用例参考。
同步阻塞 | 最常用的一种用法,使用也是最简单的,但是 I/O 性能一般很差,CPU 大部分在空闲状态。 |
同步非阻塞 | 提升 I/O 性能的常用手段,就是将 I/O 的阻塞改成非阻塞方式,尤其在网络 I/O 是长连接,同时传输数据也不是很多的情况下,提升性能非常有效。 这种方式通常能提升 I/O 性能,但是会增加 CPU 消耗,要考虑增加的 I/O 性能能不能补偿 CPU 的消耗,也就是系统的瓶颈是在 I/O 还是在 CPU 上。 |
异步阻塞 | 这种方式在分布式数据库中经常用到,例如在网一个分布式数据库中写一条记录,通常会有一份是同步阻塞的记录,而还有两至三份是备份记录会写到其它机器上,这些备份记录通常都是采用异步阻塞的方式写 I/O。 异步阻塞对网络 I/O 能够提升效率,尤其像上面这种同时写多份相同数据的情况。 |
异步非阻塞 | 这种组合方式用起来比较复杂,只有在一些非常复杂的分布式情况下使用,像集群之间的消息同步机制一般用这种 I/O 组合方式。如 Cassandra 的 Gossip 通信机制就是采用异步非阻塞的方式。 它适合同时要传多份相同的数据到集群中不同的机器,同时数据的传输量虽然不大,但是却非常频繁。这种网络 I/O 用这个方式性能能达到最高。 |
http://www.ibm.com/developerworks/cn/java/j-lo-javaio/
模型理解2:http://www.ibm.com/developerworks/cn/linux/l-async/
同步异步理解3:http://blog.csdn.net/kangojian/article/details/5710977
同步与异步:同消息通知机制有关;同步:由消息处理者自己等待消息是否返回(触发);
异步:类似事件模型,由触发机制通知信息处理者;
阻塞与非阻塞:同消息处理机制有关;阻塞:cpu一直占用;非阻塞:cpu处理其他,等数据返回则在占用CPU处理。
Selector
validOps():通道所支持的操作集合;
如 ServerSocketChannel:只支持 SelectionKey.OP_ACCEPT; 1<<4 ;
如 SocketChannel: 支持 1+4+8;
public final int validOps() { return (SelectionKey.OP_READ | SelectionKey.OP_WRITE| SelectionKey.OP_CONNECT); }
相关推荐
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于替代标准I/O(BIO)模型的一种新机制。...学习和理解Java NIO以及Netty的使用,对于提升Java网络编程的能力至关重要。
Java NIO,全称为Non-Blocking ...这个例子"一个java NIO的例子"是学习和理解Java NIO概念和机制的一个很好的起点。通过分析和运行这个示例,开发者可以更深入地理解Java NIO的工作原理,并能更好地运用到实际项目中。
首先,我们要理解Java NIO的基本概念。NIO包括以下关键组件: 1. **通道(Channels)**:通道是数据传输的途径,类似于传统IO中的流。通道可以从一个数据源(如文件或套接字)读取数据,也可以向目的地(如网络连接...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO( Blocking I/O)相比,NIO...对于初学者来说,这些源码实例可以帮助理解Java NIO的基本用法和优势,进一步提升在实际项目中的应用能力。
首先,我们要理解Java NIO的核心组件之一——流。在Java的IO体系中,流是数据传输的抽象,它代表了数据的流向,可以是输入流(InputStream)或输出流(OutputStream)。然而,NIO中的流与传统的IO流有所不同,它们...
首先,我们要理解Java NIO的基本组件。主要包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。通道是数据读写的目标或来源,缓冲区用于存储数据,而选择器则允许单个线程监视多个通道的事件,从而提高...
为了更好地理解Java NIO的使用方式,下面我们通过简单的代码示例来展示如何实现一个基本的NIO服务端和客户端。 **服务端代码实现** ```java package cn.nio; import java.io.IOException; import java.net....
文件"NIOSocket"可能是这个NIO Socket通信示例的源代码,可能包含了上述提到的ServerSocketChannel、SocketChannel、Selector和ByteBuffer的使用示例,通过阅读和分析这个文件,你可以更深入地理解Java NIO在实际...
总结,这个“JAVA NIO 异步通信模板服务端”示例是学习和理解Java NIO机制的好起点,它展示了如何利用NIO的非阻塞特性构建高并发的服务。在实际开发中,结合Android环境,可以进一步优化网络通信和数据交换的效率。
Java NIO的反应器模式设计与实现,首先涉及到理解Java NIO的基本概念,如通道(Channel)、缓冲区(Buffer)、选择器(Selector)等。通道是进行读写操作的基础,是连接I/O源和数据的端点。缓冲区是在NIO中用于数据...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O模型的新...通过系统学习,开发者将更好地理解Java NIO的优势,并能在适当的情况下选择使用NIO而非传统的BIO模型。
Java NIO(非阻塞I/O)是一种在Java中处理I/O操作的高效方式,它与传统的阻塞I/O模型不同。NIO全称为New Input/Output,它引入了通道...对于想要深入理解Java NIO和事件驱动编程的人来说,这是一个很好的实践案例。
首先,理解Java NIO的基本概念非常重要。NIO中的“N”代表“非阻塞”,这意味着在进行I/O操作时,程序可以继续执行其他任务,而不是等待数据传输完成。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择...
本资源为“基于Java NIO实现五子棋游戏”的项目文件,旨在帮助学习者深入理解Java NIO技术及其在网络编程中的应用。项目采用Java NIO库,支持非阻塞IO操作,与传统的BIO相比,NIO能提供更高效的网络和文件IO性能。本...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O模型的新...《Java NIO》这本书由Ron Hichens著,内容详细且易懂,对于学习和理解Java NIO系统提供了宝贵的资源。
理解Java NIO中的`ByteBuffer`涉及以下关键知识点: 1. **通道(Channels)**:通道是数据的来源或目的地,如文件通道、套接字通道等。它们可以与缓冲区交互,读取或写入数据。 2. **选择器(Selectors)**:选择...
首先,让我们理解Java NIO中的关键组件: 1. **通道(Channels)**:通道类似于流,但它们可以同时读写数据,且与缓冲区直接交互。常见的通道有FileChannel、SocketChannel、ServerSocketChannel等。 2. **缓冲区...
此书对于希望深入理解Java NIO工作原理、以及如何在应用中有效利用NIO特性的开发者来说,是一本宝贵的资源。它不仅提供了理论知识,还包含了许多实际的代码示例和应用场景分析,帮助读者更好地掌握NIO的使用。
Java NIO(New Input/...总之,Java NIO提供了强大的I/O能力,但同时也需要开发者对非阻塞I/O和多路复用有深入理解,才能充分发挥其优势,避免潜在的陷阱。学习和掌握NIO,对于提升Java应用的性能和扩展性至关重要。
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输...学习和理解NIO,对于开发高并发、高性能的Java应用至关重要。