java nio学习记录1

####目的:为了很好的理解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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hhb200766

菩提本无树

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值