Java 并发 —— 从 BIO 到 NIO

  • BIO,同步阻塞;NIO:同步非阻塞;
    • 在 NIO 技术之前,服务器侧使用多线程是 BIO 的一种伪阻塞的解决方法;
  • BIO 的多线程机制存在的问题:

    • 每一个 Socket 连接服务器,服务器侧都立刻开启(创建)一个线程处理,
    Socket socket = server.accept();
    while (true) {
        new Thread(new ServerHandler(socket));
    }
    • 每个 IO 操作完成后,线程就会销毁(IO 线程可以理解为一个数据传输的通道,channel),而线程的创建是比较耗费资源的,奈何取之尽锱铢,而用之如泥沙;
  • NIO 针对这 BIO 的这两个问题,进行如下的改进:

    • 新的 Socket 到来,并不立即开启线程,等到 IO 操作再开启;
      • 这便是 java.nio 的 Selector 选择子(以线程的形式存在),定义三种状态:ACCEPT,Readable,Writable
    public static final int OP_READ = 1 << 0;
    public static final int OP_WRITE = 1 << 2;
    public static final int OP_CONNECT = 1 << 3;
    public static final int OP_ACCEPT = 1 << 4;
    • 每个IO操作完成,也不立即销毁线程;
      • 这便是 java.nio 的 Channel;
    • BIO 的流式读写,不能同时读写。为了支持同时读写,变阻塞为非阻塞,java.nio 提出 Buffer 的概念;

1. buffer 机制

Java NIO Buffer

  • 三大概念:
    • capacity容量
    • position位置
    • limit限制
      • 在写模式,limit的含义是我们所能写入的最大数据量。它等同于buffer的容量。
      • 一旦切换到读模式,limit则代表我们所能读取的最大数据量,他的值等同于写模式下position的位置。
      • 数据读取的上限时buffer中已有的数据,也就是limit的位置(原position所指的位置)。
  • java nio 下的 Buffer Types:

    • ByteBuffer
      • MappedByteBuffer
    • CharBuffer
    • DoubleBuffer
    • FloatBuffer
    • IntBuffer
    • LongBuffer
    • ShortBuffer
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值