java中的线程安全的容器

ReentrantLock 和 Condition 都是基于 AbstractQueuedSynchronizer (AQS) 实现的。
以下是 ReentrantLock 与 AQS 的关系:

ReentrantLock

状态管理:ReentrantLock 通过 AQS 的 state 变量来表示锁的状态。状态为 0 表示锁未被持有,状态为 1 表示锁被持有。
队列管理:AQS 维护一个 FIFO 等待队列,当一个线程尝试获取锁但失败时,它会被加入到这个等待队列中。
模板方法:ReentrantLock 通过实现 AQS 的模板方法,如 tryAcquire 和 tryRelease,来定义锁的获取和释放逻辑。

Condition

在Java的并发编程中,Condition接口扮演着重要的角色,主要用于线程间的协调和通信。这个接口通常与ReentrantLock锁一起使用,提供了比Object类中的wait()、notify()和notifyAll()方法更加灵活和强大的线程等待/通知机制。
Condition接口提供的主要功能包括:

等待(Await):

await()方法使当前线程等待,直到其他线程通知(signal)或中断当前线程。与Object.wait()类似,当前线程会释放锁并进入等待状态。
await(long time, TimeUnit unit)是超时版的等待,允许线程在指定的时间后自动返回。
还有其他变种,如awaitUntil(Date deadline),允许线程一直等待直到特定的时间点。

通知(Signal):

signal()方法用于唤醒一个在Condition上等待的线程。这类似于Object.notify()。
signalAll()方法唤醒所有等待在此Condition上的线程。这相当于Object.notifyAll()。

安全容器

并发集合类(java.util.concurrent)

Java并发包java.util.concurrent提供了一系列从底层设计就支持线程安全的并发集合:

ConcurrentHashMap:一个高效的线程安全的哈希表,适用于高并发场景。
ConcurrentLinkedQueue:一个基于链接节点的线程安全队列,采用先进先出(FIFO)的排序原则。
CopyOnWriteArrayList:写时复制的列表,最适用于读多写少的并发场景。
CopyOnWriteArraySet:基于CopyOnWriteArrayList,适用于读多写少的场景,主要用于存储不经常变动的数据集。

阻塞队列类(java.util.concurrent)

阻塞队列不仅支持线程安全的数据操作,还可以在尝试添加或移除元素时阻塞线程:

ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。
LinkedBlockingQueue:一个由链表结构组成的可选有界阻塞队列。
PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
DelayQueue:一个使用优先级队列实现的无界阻塞队列,内部元素只有在其指定的延迟时间过后才能被取出。
SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,反之亦然。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值