同步/伪异步/异步,阻塞/非阻塞,JAVA NIO 之我见.

一,同步/伪异步/异步(任务线程---服务端任务的执行)   同步和异步的体现主体是---任务执行线程. 如任务A,B,  
     1,同步---B任务的执行需要A任务执行后才进行.
     2,伪异步--- B,A两个任务同时执行,但执行完成后,需要执行者主动轮询,或者使用多路复用模型专门指定一个线程来对执行结果进行跟进.
     3,异步---B,A两个任务同时执行.且执行完后,会主动响应数据,之后告诉任务完成.
二,阻塞/非阻塞(客户线程--客户端调用服务端的状态)  阻塞/非阻塞体现的主体是---任务执行者线程.  如任务,A,B 的执行者  
     1,阻塞---执行者执行A任务.一直等待A完成后才去执行B任务.  
     2,非阻塞---执行者执行A任务后.打个标志.然后不用等结果.就去执行B任务.

      备注:异步是啥,有多种说法相互矛盾(同样是很权威的几本书,包括操作系统教程,对于异步的定义都是不同的,有人把IO多路复用归为异步,有人把它归为同步。个人更喜欢将多路复用归为--伪异步)

a,阻塞I/O

b,非阻塞I/O

c,多路复用I/O

d,信号驱动I/O

e,异步I/O

java NIO的实现:三个核心概念.

一,Selector: 即多路复用模型中,负责轮询各个线程状态的线程.

二,socketChannel: 只是java对sockect的一种封装.为了方便selector对socket进行管理而封装的对象

三,Buffer :缓存堆   
有两类实现,一个是HeapBuffer ,一个是DirectBuffer. 区别如下  

HeapBuffer ----堆缓冲  :其实是在java 的内存模型中,java 虚拟机可以直接管控的

DirectBuffer ---直接缓冲 :使用native ,调用的是c 或者c++ 的代码直接操作系统内存,不在java的内存模型中,我们称为堆外内存,java 虚拟机无法管控;但是 address 维护了堆外内存的引用 (在buffer 类中维护者 long address)

使用DirectBuffer效率高于HeapBuffer, DirectBuffer数据的读写直接与堆外的内存(系统内存)打交道,少了一次数据的读写过程,实现了zero copy (零copy)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值