摘要: 构造方法 ArrayBlockingQueue 提供了三个构造方法,分别如下。 capacity: 表示数组的长度,也就是队列的长度fair:表示是否为公平的阻塞队列,默认情况下构造的是非公平的阻塞队列。 其中第三个构造方法就不解释了,它提供了接收一个几个作为数据初始化的方法: public Arr 阅读全文
posted @ 2020-06-10 18:01 47号Gamer丶 阅读(362) 评论(0) 推荐(1) 编辑
摘要: 生产者消费者的实际使用 我相信大家都有使用过分布式消息队列,比如 ActiveMQ、kafka、RabbitMQ 等等,消息队列的是有可以使得程序之间实现解耦,提升程序响应的效率。如果我们把多线程环境比作是分布式的话,那么线程与线程之间是不是也可以使用这种消息队列的方式进行数据通信和解耦呢? 阻塞队 阅读全文
posted @ 2020-06-10 17:39 47号Gamer丶 阅读(242) 评论(0) 推荐(0) 编辑
摘要: AQS 是什么 在 Lock 中,用到了一个同步队列 AQS,全称 AbstractQueuedSynchronizer,它是一个同步工具也是 Lock 用来实现线程同步的核心组件。如果你搞懂了 AQS,那么 J.U.C 中绝大部分的工具都能轻松掌握。 AQS 的两种功能 从使用层面来说,AQS 的 阅读全文
posted @ 2020-06-10 16:55 47号Gamer丶 阅读(901) 评论(0) 推荐(0) 编辑
摘要: 紧接上篇~ 数据迁移阶段的实现分析 通过分配好迁移的区间之后,开始对数据进行迁移。在看这段代码之前,先来了解一下原理: synchronized (f) {//对数组该节点位置加锁,开始处理数组该位置的迁移工作 if (tabAt(tab, i) == f) {//再做一次校验 Node<K, V> 阅读全文
posted @ 2020-06-10 15:32 47号Gamer丶 阅读(374) 评论(0) 推荐(0) 编辑
摘要: 紧接上篇 CounterCells 初始化图解 初始化长度为 2 的数组,然后随机得到指定的一个数组下标,将需要新增的值加入到对应下标位置处: transfer 扩容阶段 判断是否需要扩容,也就是当更新后的键值对总数 baseCount >= 阈值 sizeCtl 时,进行 rehash,这里面会有 阅读全文
posted @ 2020-06-10 15:31 47号Gamer丶 阅读(426) 评论(0) 推荐(0) 编辑
摘要: 这篇随笔的篇幅长,所以分为上、中、下三篇,内容紧接上篇,如果有兴趣可自己抽空揣摩,有错误的地方可以指正。 ConcurrentHashMap 的初步使用及场景 CHM 的使用 ConcurrentHashMap 是 J.U.C 包里面提供的一个线程安全并且高效的 HashMap,所以Concurre 阅读全文
posted @ 2020-06-10 15:30 47号Gamer丶 阅读(630) 评论(0) 推荐(1) 编辑
摘要: CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续工作。 CyclicBarrier 默认的构造方法是 CyclicBar 阅读全文
posted @ 2020-06-10 11:54 47号Gamer丶 阅读(239) 评论(0) 推荐(0) 编辑
摘要: semaphore 也就是我们常说的信号灯,semaphore 可以控制同时访问的线程个数,通过 acquire 获取一个许可,如果没有就等待,通过 release 释放一个许可。有点类似限流的作用。叫信号灯的原因也和他的用处有关,比如某商场就 5 个停车位,每个停车位只能停一辆车,如果这个时候来了 阅读全文
posted @ 2020-06-10 11:08 47号Gamer丶 阅读(160) 评论(0) 推荐(0) 编辑