java nio学习记录1

来源:互联网 发布:社工库数据库共享平台 编辑:程序博客网 时间:2024/06/05 11:06

####目的:为了很好的理解hadoop中zookeeper,深入了解其原理

一、nio基本实现

1、java nio 提供了阻塞与非阻塞的方式响应socket,通过selector注册channel方式,轮询可以操作的io流对象,取得selectionkey,实现socket数据流的操作;

 2、selector与channel的非阻塞方式同步使用;

3、channel:serversocketchannel、socketchannel、datagramchannel(upd),绑定本地服务端口channel.socket().bind(port)

4、selector.open打开注册器,serversocketchannel.open/datagramchannel.open打开监听通道

5、设置channel为noblock,注册channel.register()

6、注册selectionkey的属性read、write、accepet/connection

7、clientchannel打开监听端口,

8、server/client实现信息发送接收,通过selector获取当前可操作selectionkey,取得当前通道实现消息sendorwrite

二、nio原理

1、Java NIO相对于旧的java.io库来说,并不是要取代,而是提出的三个新的设计思路:

  • 对原始类型的读/写缓冲的封装
  • 基于Channel的读写机制,对Stream的进一步抽象。
  • 事件轮询/反应设计模式(即Selector机制)

按上述思路,而Channel机制是作为Stream的进一步抽象而产生的,那么Channel和Stream相比有什么不同呢?按字面理解实际上就可以获得信息:Stream作为流是有方向的,而Channel则只是通道,并没有指明方向。因此,读写操作都可以在同一个Channel里实现。Channel的命名强调了nio中数据输入输出对象的通用性,为非阻塞的实现提供基础。

2、

三、nio局限

1、查看一些大牛的文章,了解到java nio为了兼容不同平台的底层实现,为了对开发着提供统一api,其底层实现在window上tcp链接而linux系统则是pipe,并且开启一个selector

链接会成对出现保证自身的可及时唤醒,所以如果打开多个selector有可能跑出lookback等异常。

2、在开源mina和grizzy中,mina采用cpu个数来初始化selector线程池而grizzy只有2个selector线程,同样的是两者都采用了accept与事件处理分离的处理方式

四、nio如何保证数据一致性

zookeeper保证多个server的数据一致性是其最为出众的地方,其中消息传递与nio有关系,利用nio的高可用性实现消息

0 0