持续精进_java语言3

2018-11-21  本文已影响16人  兮兮码字的地方

一,IO

java.io 包,提供了通过输入输出流的方式来实现网络通信。

很多时候,java.net 下面提供的部分网络 API,比如 Socket、ServerSocket、HttpURLConnection 也归类到同步阻塞 IO 类库,因为网络通信同样是 IO 行为。

传统的IO流在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序

java.io 包的好处是代码比较简单、直观,缺点则是 IO 效率和扩展性存在局限性,容易成为应用性能的瓶颈。

持续精进_java语言3

二,两组概念

同步或异步(synchronous/asynchronous)。

简单来说,同步是一种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调用返回,才会进行下一步;而异步则相反,其他任务不需要等待当前调用返回,通常依靠事件、回调等机制来实现任务间次序关系。

阻塞与非阻塞(blocking/non-blocking)。

在进行阻塞操作时,当前线程会处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续,比如 ServerSocket 新连接建立完毕,或数据读取、写入操作完成;而非阻塞则是不管 IO 操作是否结束,直接返回,相应操作在后台继续处理。

三,传统IO弊端

Java 中启动或者销毁一个线程是有明显开销的,为避免频繁创建、销毁线程的开销,我们可以维护一个固定大小的线程池,来管理工作线程。如下图这样的模式。

持续精进_java语言3

如果连接数并不是非常多,只有最多几百个连接的普通应用,这种模式往往可以工作的很好。但是,如果连接数量急剧上升,这种实现方式就无法很好地工作了,因为线程上下文切换开销会在高并发时变得很明显,这是同步阻塞方式的低扩展性劣势。

三,NIO

NIO 引入的多路复用机制,实现同步非阻塞

如下图这样的模式。

持续精进_java语言3

传统IO 需要多线程以实现多任务处理。而 NIO 则是利用了单线程轮询事件的机制,通过高效地定位就绪的 Channel,来决定做什么,仅仅 select 阶段是阻塞的,可以有效避免大量客户端连接时,频繁线程切换带来的问题,应用的扩展能力有了非常大的提高。

上一篇 下一篇

猜你喜欢

热点阅读