1.大数据学习之旅——NIO

版权声明:版权归零零天所有 https://blog.csdn.net/qq_39188039/article/details/86216204

Concurrent包

jdk1.5所提供的一个针对高并发进行编程的包。

阻塞式队列 - BlockingQueue

遵循先进先出(FIFO)的原则。阻塞式队列本身使用的时候是需要指定界限。
ArrayBlockingQueue - 阻塞式顺序队列 - 底层是基于数组来进行存储,使用的
时候需要指定一个容量, 容量在指定之后不可改变。— 生产-消费模型
LinkedBlockingQueue - 阻塞式链式队列 - 底层是基于链表(节点)来进行数据
的存储。在使用的时候可以指定初始容量,也可以不指定。如果指定了容
量,就以指定的容量为准来进行存储;如果不指定容量,那么默认容量是
Integer.MAX_VALUE -> 2 31 - 1。如果不指定容量,一般认为这个容量是无限的
PriorityBlockingQueue - 具有优先级的阻塞式队列 - 如果不指定容量,默认容量
是11。如果将元素一一取出,那么会对元素进行自然排序 — 要求存储的对
象所对应的类必须实现Comparable, 重写compareTo方法, 将比较规则写到方
法中;如果进行迭代遍历, 那么不保证排序
SynchronousQueue - 同步队列 - 只允许存储1个元素

并发映射 - ConcurrentMap

HashMap - 底层依靠数组+链表存储的数据。默认初始容量是16,默认加载
因子是0.75f,默认扩容每次增加一倍。本身是一个异步式线程不安全的映射
Hashtable - 同步式线程安全的映射 — 对外提供的方法都是同步方法
ConcurrentHashMap - 异步式线程安全的映射 - 在jdk1.8之前,采用分段(分桶)
锁, 分段锁采用的是读写锁机制(读锁:允许多个线程读,但是不允许线程
写;写锁:允许一个线程写,但是不允许线程读);jdk1.8不再采用锁机
制,而是CAS(Compare and Swap)算法, 减小了锁的开销;如果一个桶中的元
素个数超过了8个,那么会将这个桶的链表扭转成一棵红黑树(自平衡二叉
查找树)结构。

在这里插入图片描述

红黑树的修正过程:

  1. 当前节点为红色,且父节点以及叔父节点为红,那么将父节点以及叔父
    节点涂黑,将祖父节点涂红
  2. 当前节点为红色,并且是右子叶,父节点为红且叔父节点为黑,那么以
    当前节点为基准进行左旋
  3. 当前节点为红色,并且是左子叶,父节点为红且叔父节点为黑,那么以
    父节点为基准进行右旋
    红黑树的修正过程:
    红黑树的查找的时间复杂度是:O(logn)

NIO

是jdk1.4出现的新的流.
BIO - Blocking IO - 同步式阻塞式IO — UDP/TCP
NIO - New IO - 同步式非阻塞式IO
AIO - AsynchronousIO - 异步式非阻塞式IO - jdk1.8

BIO的缺点:

  1. 会产生阻塞行为 — receive/accept/connect/read/write
  2. 一对一的连接:每连接一个客户端,在服务器端就需要开启一个线程去处
    理请求.在客户端较多的情况下,服务器端就会产生大量的线程 - 耗费内
  3. 连接建立之后如果不发生任何的操作.那么就会导致服务器中的这个线
    程依然被占用,耗费服务器的资源
  4. 无法实现定点操作

NIO

三个基本的组件:Buffer-缓冲区, Channel-通道, Selector-多路复用选择器

Buffer - 缓冲区

容器 - 存储数据 - 在底层存储数据的时候实际上是以数组形式来存储
capacity - 容量位 - 指定缓冲区的容量
limit - 限制位 - 限制操作位所能达到的尺度
position - 操作位 - 指定要操作的位置
mark - 标记位 - 标记位置,认为标记位置之前的数据是已经操作过的没有错
误的数据
mark <= position <= limit <= capacity
flip - 反转缓冲区:先将限制位挪到操作位上, 然后将操作位归零, 清空标记位
clear - 清空缓冲区: 将操作位归零,将limit挪到capacity,将标记位清空
reset - 重置缓冲区: 将操作位挪到标记位
rewind - 重绕缓冲区: 将操作位归零,将标记位清空 — 缓冲区多次读取

Channel - 通道

传输数据 - 是面向缓冲区的。在java中,Channel默认也是阻塞的,需要手
动将其设置为非阻塞模式。
BIO: File、UDP - DatagramSocket、TCP - Socket, ServerSocket
NIO: FileChannel、UDP - DatagramChannel、TCP - SocketChannel,
ServerSocketChannel
FileChannel - 操作文件,可以利用通道实现相同平台之间的零拷贝技术。

Selector - 多路复用选择器

进行选择 - 是面向通道进行操作。要求通道在使用的时候必须设置为非阻

可连接,可读、可写
客户端
可接受,可读,可写
服务端
通过Selector可以实现利用同一个服务器端来处理多个客户端的数据 — 可
以用少量线程处理大量的请求 — 在底层处理的时候实际上依然是同步的

NIO的优势:

  1. 非阻塞:提高传输效率
  2. 一对多的连接:可以用一个或者少量的服务器中的线程来处理大量的请
    求,从而节省服务器的内存资源
  3. 即使已经建立连接,只要没有对应的读写事件,那么依然不能够使用服
    务器来进行处理
  4. 利用通道实现数据的双向传输
  5. 因为利用缓冲区来存储数据,所以可以对缓冲区中的数据实现定点操作

源码下载
下一篇 2.大数据学习之旅——红黑树

猜你喜欢

转载自blog.csdn.net/qq_39188039/article/details/86216204
今日推荐