JavaAPI-concurrent-无锁API

目录

目标

JDK

atomic

since1.5

since1.8

concurrentxxxx并发集合

CountDownLatch


目标

个人将concurrent包中的众多类分为加锁和不加锁两个分类,本文针对不加锁分类进行介绍。

JDK

JDK8

atomic

since1.5

AtomicBoolean/Integer/Long/Reference,value原子性更新

AtomicIntegerArray/LongArray/ReferenceArray,element value原子性更新

since1.8

多线程并发累积的解决方案

  • 累积器 

自定义累积方式,加减乘除或其他,Long/DoubleAccumulator

  • 叠加器

叠加方式 Long/DoubleAdder

  • Striped64

作为累积器叠加器的super

原理:使用cell[]存储每个线程累积结果。当需要获取当前结果时:cell[]遍历+累积操作

concurrentxxxx并发集合

实现都使用volatile+cas方式

ConcurrentLinkedQueue 可并发访问的FIFO队列,不保证size/遍历的实时准确性

ConcurrentLinkedDeque 可并发访问的双向队列,不保证size/遍历的实时准确性

ConcurrentSkipListMap 依据key和compare,构成Index tree,有序的Node list

ConcurrentSkipListMap 

  • 查找过程

在tree中,通过对比key的大小,定位key在list中的前任node(即node.key一定小于key);从node开始,向后进行key比较,获取命中的node。

  • 数据结构图

  • tree查找逻辑
while
	if key > index.node.key
		index.right
	else
		if index.down == null
			return index.node
		else
			index.down	
end while

ConcurrentSkipListSet 

CountDownLatch

作为多个线程间流程同步协调器,保证n个线程一直等待,直到其他m个线程执行完某个流程

count不可重置

提供的行为:countDown(),await([timeout])

当线程调用await后,实际流程与Sync有关,概括为:for循环判断state是否为0 + park

由内部类(private static final class Sync extends AbstractQueuedSynchronizer)进行同步控制,使用AQS中的state标示count。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值