目 录CONTENT

文章目录

第六章 jdk几种分布式框架

FatFish1
2024-10-25 / 0 评论 / 0 点赞 / 67 阅读 / 0 字 / 正在检测是否收录...

ConcurrentHashMap - 线程安全哈希map

线程安全的HashMap,相比HashSet一个synchronized锁全表,ConcurrentHashMap效率更高,jdk7及以前的版本是分成一个个segment实现的,jdk8及以后使用Node+CAS+synchronized

put的核心思想:

  • 如果数组tab不存在,使用unsafe提供的同步能力初始化数组

  • 如果对应哈希位没有元素,使用CAS操作插入

  • 如果有哈希冲突,使用sychronized锁表

具体代码可以参考ConcurrentHashMap部分

ConcurrentLinkedQueue - 线程安全无界队列

非阻塞无边界队列,它的性能是所有队列里面最高的,因为它并未使用阻塞或等待/通知机制实现。也没有使用任何锁。因此它的方案是无限自旋+CAS操作。

具体代码见ConcurrentLinkedQueue部分

阻塞队列

阻塞指的是队满时阻塞插入线程,队空时阻塞移除方法,阻塞队列有几种通用的方法:

  • 插入:add(抛出异常),offer(返回特殊值且提供超时能力),put(一直阻塞)

  • 移除:remove(抛出异常),poll(返回特殊值及超时能力),take(一直阻塞)

  • 检查:element、peek

阻塞队列类型:

  • ArrayBlockingQueue:数组构成的有界阻塞队列

  • LinkedBlockingQueue:链表构成的有界阻塞队列

  • PriorityBlockingQueue:支持优先级排序的无界阻塞队列

  • DelayQueue:使用优先级队列实现的无界阻塞队列

  • SynchronousQueue:一个不存储元素的阻塞队列

  • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列

  • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列

ArrayBlockingQueue - 数组有界阻塞队列

ArrayBlockingQueue的特性包括:

  • 数组+FIFO排序

  • 使用ReentrantLock,默认非公平

代码详见ArrayBlockingQueue部分

LinkedBlockingQueue - 链表有界阻塞队列

特性包括:

  • 使用链表实现,FIFO排序

  • 默认最大长度是Integer.MAX_VALUE

代码见LinkedBlockingQueue部分

PriorityBlockingQueue - 优先级阻塞队列

特性:

  • 底层为数组实现,无解阻塞队列

  • 默认情况下元素按自然顺序排序,或自定义comapreTo()方法指定元素排序规则或初始化

代码见PriorityBlockingQueue部分

DelayQueue - 阻塞无界延迟队列

特性:

在非阻塞优先级队列PriorityQueue的基础上增加了阻塞和延迟能力,需要实现Delayed接口,只有延迟期满,才能从队列中提取元素获取元素

DelayQueue的使用场景:

  • 内存缓存系统:缓存到期即可以获取到元素

  • 定时任务调度:一旦从DelayQueue中获取到元素,即可以开始执行,衍生了TimerQueue

代码见DelayQueue部分

LinkedTransferQueue - 链式无界阻塞预占队列

特性:

  • 具有独特的transfer方法和tryTransfer方法,用于将元素直接传递给正在等待的消费者

  • 入队的元素都会封装成Node,其中具备一个isData属性,true代表封存的是元素,false代表封存的是等待的消费线程,如果存在封存的等待线程,则不入队,将元素直接传递给消费线程并激活

代码见LinkedTransferQueue部分

LinkedBlockingDeque - 链式阻塞双端队列

特性:

  • 与LinkedBlockingQue类似,但是具备双向插入和移出元素的能力,从而使竞争减少一半

  • 提供addFirst、addLast、offerFirst、offerLast、peekFirst、peekLast等方法

LinkedBlockingDeque用于工作窃取算法,可以使一个线程池被阻塞的时候,由其他空闲线程池辅助完成该线程池的工作任务

代码见LinkedBlockingDeque部分

(4)Fork/Join框架

ForkJoin框架部分

0

评论区